<正規表現>直書きしない文字列否定

このQ&Aのポイント
  • Objective-Cの正規表現で、「引数内に関数が使用されていない関数」をマッチさせたい場合、どのような正規表現を使用すれば良いでしょうか。
  • 具体的な例として、検索対象文字列とマッチさせたい文字列を示します。
  • 関数名を直書きせずに、いろいろな関数名に対応する正規表現を組みたいと考えています。どのような正規表現が適切でしょうか。
回答を見る
  • ベストアンサー

<正規表現>直書きしない文字列否定

Objective-Cの正規表現について質問です。 表計算ソフトなどで使う数式を検索対象文字列として、「引数内に関数が使用されていない関数」をマッチさせたいと考えています。 どの様な正規表現であれば良いかご教示頂けますでしょうか。 以下に具体例を示します。 -------------------------------------------- ■検索対象文字列 =SUM(A1:A3;SUM(B1:B3);ROUND(IF(C2>10;1.234;0);2)) ※数式の内容は適当です ■マッチさせたい文字列 SUM(B1:B3) IF(C2>10;1.234;0) ■補足説明 1) 検索対象文字列の最初のSUM関数の引数内には別のSUM関数等が使用されているので除外。 2) 2番目のSUM関数の引数内には関数が使用されていないのでマッチさせる。 3) ROUND関数の引数内にはIF関数が使用されているので除外。 4) IF関数の引数内には関数が使用されていないのでマッチさせる。 ■その他条件 1) 関数名は2~5文字の英字とする  例.SUM(),IF(),ROUND()など 2) 正規表現内で関数名の直書きはしない 3) セル参照式のアルファベットは必ず1文字とする  例.A1やZ30等。AB1やBZ30等は無い。 -------------------------------------------- 関数の引数内に「英字2~5文字がある場合は除外する」と言う意味で、以下の様な正規表現を組んだのですが上手くいきませんでした。 [A-Za-z]{2,5}\([^([A-Za-z]{2,5})]*\) 以下の様に関数名を直書きすれば理想の結果となるのですが… [A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\) あくまで、いろいろな関数名に可変で対応したいと考えています。 どの様な正規表現であれば良いでしょうか。 お知恵を貸して頂ければと思います。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あ, 念のためですが, 「本来の正規表現では不可能」というのは, 主にかっこの問題です. つまり, 正規表現だと IF((A1+B3)/(C2+5) > 3; 7; 1) とかいうばあいに 「IF((A1+B3)」 だけを取り出しちゃったりするんですね. 逆に言えば, 「括弧は関数のためだけにある」というならできるような気がします.

tomokingdom
質問者

お礼

なるほど「本来の正規表現では不可能」はそう言う意味だったのですね。 確かに「括弧は関数のためだけにある」と言うルールがあれば出来そうですね。 こんな感じでしょうか。 [A-Za-z]{2,5}\([^\(\)]*\) しかし括弧は必要なのです… 再回答ありがとうございます。 もう少し悩んでみます。

tomokingdom
質問者

補足

正規表現を使って一発で検索する事を断念しました。 関数の「(」から、「(」と「)」の数を数えていけば関数の「)」を判別できそうです。 そして、関数の「(」から「)」までの間に関数が使われていないかチェックする。 この繰り返しで「引数で関数が使われていない関数」を見つけ出す事にしました。 泥臭いのですが今のところ他に思い付かないのでコレで行こうと思います。 ご回答ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

まず, この処理は「本来の正規表現」では原理的に不可能です. ただし, 今日では「正規表現」と言っていながらこれができたりするものもあるので, 厳密にはあなたが使っている「正規表現」に依存する部分もあります. ところで, [A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\) で本当にいいんでしょうか? 例えば =SUM(A1:A3;SUM(F1:F3);ROUND(IF(D2>10;1.234;0);2)) とかで困りそうな気がするんですが.

tomokingdom
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り [A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\) ではダメでした。 例題の対象文字列で、たまたま上手く出来ていただけでした。 当方の確認不足です。すみません。 不可能だと言う事が分かっただけでも助かりました。別の方法を検討してみます。 ありがとうございました。

関連するQ&A

  • 正規表現 英数字を1つ以上含む文字列

    ASP.NET(VB)での入力チェックのために、 半角英数字「0~9」「a~z」「A~Z」と、ハイフン「-」からなる文字列 (ただし、半角英数字「0~9」「a~z」「A~Z」はそれぞれ少なくとも1個ずつ含む) の正規表現での表し方が知りたいです。  How To: ASP.NET への入力を制約するために正規表現を使用する方法  http://www.microsoft.com/japan/msdn/enterprise/pag/securityguidance/paght000001.aspx  (?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$  8から10文字で、最低1文字の数字と1文字の英字を使用し、特殊文字を使用してはいけません。 上記を参考に、 (?!^[0-9]*$)(?!^[a-z]*$)(?!^[A-Z]*$)^([a-zA-Z0-9])$ こんな感じかなぁと試してみたのですが、ダメでした。 そもそも「!」の意味が分かりません。否定でしょうか??

  • 秀丸での正規表現:複雑な条件を指定する場合

    秀丸エディタの強調表示設定を正規表現を使用して使用しています。 [a-zA-Z][a-zA-Z0-9_]+\s+[a-zA-Z][a-zA-Z0-9_]+ という正規表現でマッチさせたいのですが、else if というケースでもヒットすると思います。これを例外としてマッチさせたくない場合、どういった記述になるのかが思いつきません。直接的な答えでなくてもいいので、何か解法のヒントなどありましたらご指南いただけませんでしょうか。 よろしくお願いいたします

  • 正規表現について

    例えば sample( 34 ,12 );みたいな関数があって、それを丸ごと置換ダイアログで消したいのですが、 (引数は任意で、間にスペースがあったりなかったりする) 正規表現の使い方がいまいちよく判りません。 検索文字列を ”sample(":z,:z");” <-全然自信無し。 としてもやっぱりヒットしませんでした。 どうすればよいか教えてください。 正規表現のチェックボックスはオンにしてあります。

  • 正規表現で特定の文字集団以外の文字列があるとマッチする書き方

    正規表現で特定の文字集団以外の文字列があるとマッチするというものです。"ABCDEFGHIJK0123456789"以外の文字が1つでもあればそれにマッチし、$1,$2...にそれらを格納する書き方が知りたいです。 たとえば、 "ACKL1-BZaF" なら、マッチして、そして $1にL $2に- $3にZa あと、正規表現の真髄は、よくNFA,DFAの違いがわかれば良いなど書いていますが、身近にこの違いがはっきるわかる事例ってありますか?

  • 秀丸の正規表現

    秀丸の正規表現 http://pc.dearie.jp/hidemaru/replace/14.html 上記URLでメールの正規表現について解説があります。 [A-Za-z0-9\-\.\_]+@[A-Za-z0-9\-\_]+\.[A-Za-z0-9\-\.\_]+ この正規表現でメールの検索をおこなっています。この正規表現は理解出来ます。 .*([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+)([^a-z0-9@\.\-\_]+).* キャプチャを使って正規表現でメールアドレスをマッチしているのは理解できます。 なぜ置換で、「\1,」とやっても、メールアドレスのみを取得できないのでしょうか? 実際に秀丸エディタを使ってやってみましたが、メールアドレスのみ取得することができませんでした。 検索ではメールアドレスにマッチするのに、なんでキャプチャが正しく動かないのかがわかりません・・・

  • 正規表現

    正規表現で 数値と半角記号(!#$%()~|-^@[;],./`{+*}_)が入っているというものを表現したいのですが、、、 下記のような正規表現をすると、エラーになってしまいます。何かよい方法はありませんか? ^[a-zA-Z0-9\-_!#$%()~|-^@[;],./`{+*}_]*$ 又、携帯電話のチェックをしたいのですが、 1文字以上の文字列があってというような処理にしたいのですが、何かよい方法はないでしょうか? ereg( "@docomo\.ne\.jp$", $email )

    • ベストアンサー
    • PHP
  • 正規表現で入力チェックするには。

    正規表現を使用して入力チェックをしようと考えていますが特殊記号文字がうまくいきません。 [0-9a-zA-Z]で英数字はチェックする事ができたんで下記の特殊文字を指定するとエラーになってしまい困っています。 「!"#$%&'()=~|`{+*}<>?_-^\@[;:],./」 ロジックは以下のように記述しています。 Pattern p = Pattern.compile("[0-9a-zA-Z!\"#$%&'()=~|`{+*}<>?_-^\\@[;:],./]"); Matcher m = p.matcher("文字列"); if(m.matches() == true){   System.out.println("1"); } else{   System.out.println("2"); } ※「\」と「"」はエスケープしています。 下記のエラーメッセージが表示されてなんとなくですが正規表現でエラーになっているのはわかるんですが・・・ Illegal character range near index 32 [0-9a-zA-Z!"#$%&'()=~|`{+*}<>?_-^\@[;:],./]                       ^ 申し訳ありませんがアドバイスいただけませんでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • 正規表現

    正規表現の使い方を教えて下さい。 下記のソースでは、oPerl5Util.matchメソッドから戻って来ません。 正規表現文字列が悪いのか それともメソッドの呼び方の手順などが悪いのか 指摘して下さい。 import org.apache.oro.text.perl.Perl5Util; public class clsTestMain {  public clsTestMain() {}  public static void main(String[] args) {   clsTestMain clsTestMain1 = new clsTestMain();   Perl5Util oPerl5Util = new Perl5Util();   String sPattern = "/[0-9a-zA-Z_!#$%&'*+-/=?^`{|}~]+(.[0-9a-zA-Z_!#$%&'*+-/=?^`{|}~]+)*@[0-9a-zA-Z-]+(.[0-9a-zA-Z-]+)*/";   String sTaget = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890@.jp";     try {    boolean bResult = oPerl5Util.match(sPattern,sTaget); // ここで処理が止まる    System.out.println(bResult); // ここにも来ない   } catch (Exception oException) {    oException.printStackTrace(); // ここにも来ない   }  } }

    • ベストアンサー
    • Java
  • どなたかこの正規表現を変更してくれませんか?

    正規表現の素人で困っています。 s/(http:\/\/[0-9A-Za-z]+[\-\.\/0-9A-Za-z_~]*[\/0-9A-Za-z]+)([\x80-\x9f\xe0-\xfc].)?/<A HREF="$1">$1<\/A> という正規表現が「引数付きURLの引数部分(?より先)は無視する」 という内容になっていまして、?より先も含めるようにしたいのです。 現状だと以下のURLを例に http://test.japan.com/test.php?d=404861&c=c6 http://test.japan.com/test.php test.phpまでしか拾ってくれません。 どの様に書き換えればいいのでしょうか?

  • 正規表現 TCL regexp関数

    regexp関数を用いて正規表現で文字列を操作したいですが、 上手く正規表現でかけなくて困っております。 変数=第一文字列,第二文字列,第三文字列,第四文字列,第五文字列 regexp --{,,,,$} 変数 match A B C D E と実現し、区切った文字をそれぞれA-Eの変数へ代入。 【操作文字列】 ・CSV形式の”,”カンマ4つで5区分に切ります ・第一文字列は先頭の文字は空白以外の[A-Za-z0-9_]途中空白有(\s) ・第二文字列は空(,,) ・第三文字列は数字 ・第四文字列は文字のみ空白なし数字なし ・第五文字列は数字文字混在 このように実現したいのですが、正規表現を見ながら regexp --{\c\w,^\c,\d+,\w+,\c+$} 変数 match A B C D E のようにやったのですが、無理でした