正規表現のメタ文字としての「)」の理由は?

このQ&Aのポイント
  • 正規表現で使用される「)」(カッコ閉じ)は、他のメタ文字とは異なり、特別な扱いを受けます。
  • 「)」を検索するためにはエスケープが必要であり、/)/のようにマッチ演算子を使って検索することができます。
  • 一方で、「]」や「}」はメタ文字ではなく、エスケープせずにそのまま使用することができます。
回答を見る
  • ベストアンサー

正規表現で「)」がメタ文字の理由?

Perlの正規表現で、「)」(カッコ閉じ)は、「(」(カッコ開け)同様メタ文字で、もし/)/のようなマッチ演算子を書いて、「)」という文字列を検索しようとすると、Unmatched ) in regexというエラーになります。 しかし、「]」(角カッコ閉じ)や、「}」(中かっこ閉じ)は、メタ文字ではなく、/]/、/}/のようなマッチ演算子は正当で、それぞれ]、}をきちんと検索するのです。 「[」(角カッコ開け、文字クラスを作る)や、「{」(中かっこ開け)はメタ文字なのに、です。 開けがこないのに閉じが来た場合、]と}はエラーにならないのに、)だけはエラーになります。 これは、なぜでしょうか。

  • Perl
  • 回答数4
  • ありがとう数15

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

No2さんのが近いと思いますが、() はその内部に任意の正規表現を書けるからでしょう。 /a)b/ が /a\)b/のように解釈されOKだとして、それを() で囲もうとした途端に破綻します。 /(a)b)/ はどう解釈すれば良いでしょうか?あるいは、このときは /(a\)b)/ と書かないとエラーにしますか?

TYWalker
質問者

お礼

おおおー!!! これでバッチリわかりました!!!! /(a)b)/、確かにわけわかりませんね。 ありがとうございました!!!!!

その他の回答 (3)

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

ちょろっと調べてみると ] や } を「メタ文字」とはしていない資料があったりする.... ちなみに { は微妙な扱いだったりするのが難しいところ.

TYWalker
質問者

お礼

ありがとうございます!そう、Camel Bookには(){[しかメタ文字になってないんです。そこからの疑問でした。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

詳しく調べたわけではありませんが () は入れ子に使われるので、正規表現の構文解析方法が []や{}と違うからではないか、と思います。 メタ文字としての{}の中には数字、カンマ、特定の文字列しか入りません。 メタ文字[]の中も特殊なのは[や[^の直後の]と [:文字クラス:] があるだけです。 対して、()はいくらでも入れ子にできます。 []や{}のような単純なルールの適用は難しいです。 「この場合は ) は通常の文字」とかいうルールを書きだしていったら、わけわからなくなると思います。

TYWalker
質問者

お礼

なるほど!分かってきました。

  • adobe_san
  • ベストアンサー率21% (2103/9760)
回答No.1

そりゃ簡単な事でんがな! メタ文字の「グループ化演算子」として使われとるからでっせ! http://www.lightship.co.jp/FileVisor6/help/operation/regexp.htm つまりやのぉ~、「(」はグループの始まりやさかい「文字列と認識する。 で、「)」はグループ化演算子の終わりと認識するさかい「文字列では無い」となるんでっせ!

TYWalker
質問者

補足

ううん、おっしゃるとおりですが、それだと反復量指定子の終わりを示す「}」や文字クラスの終わりを示す「]」がメタ文字じゃないのがなぜかイマイチわからへんのですが。。

関連するQ&A

  • 正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。

    正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。 現在、正規表現でチェックするコードがあります。 この正規表現中の数字「9」を「\d」に置換えました。  置換え前)  置換え後)   9([x]c+)*&  \d([x]c+)*& VisualStudio2008のC#にて実装し、文字列「9xc1&」で テストすると結果が異なりました。 (Regexクラスのオプションはデフォルトのまま) Regex.IsMatch("9xc1&", @"9([x]c+)*&") == false Regex.IsMatch("9xc1&", @"\d([x]c+)*&") == true 置換え前が正しいと思うのですが、メタ文字に置換えると グループやアスタリスクの影響を受けるのでしょうか? アドバイスをお願い致します。

  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • 正規表現でメタ文字チェック

    正規表現でメタ文字チェック 正規表現で半角メタ文字が入力されていた場合、エラーにしたいと思っています。 /!|"|#|%/ しかし、上記の書き方だと、すべてのメタ文字を書かなければいけないため あまり見栄え的によくないのですが、何か他に良い方法はありませんでしょうか? お分かりになる方よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現の仕様について

    "abcdefg"という文字列に対して、/a(bc|bcd)/ という正規表現で検索すると 秀丸エディタの正規表現検索では、"abcd"がマッチし、 スクリプト言語のrubyでは"abc"がマッチします。 これは使用している正規表現ライブラリで演算子'|'の評価の仕方が異なるのだと思うのですが、統一された仕様のようなものは存在しないのでしょうか? 他の正規表現ライブラリ間でもこのような細かな動作の違いというのは存在するのでしょうか?

  • 文字列比較

    文字列比較演算子で~の文字列の中に~が含まれていれば真を返すという下記のようなサンプルを作ったのですが、「ソ」「タ」「ゼ」「ー」の4文字だけ比較することができませんでした。エラーは 「ソ」 Unrecognized character \x94 at untitled2.pl line 5. 「タ」 エラーなし。ただし比較せず。 「ゼ」 Unmatched [ in regex; marked by <-- HERE in m/ゼ <-- HERE / at untitled2.pl line 4. 「ー」 Unmatched [ in regex; marked by <-- HERE in m/ー <-- HERE / at untitled2.pl line 4. と表示されましたのですが、これは上記の4文字に関しては部分比較することができないのでしょうか? それとも別の方法があるのでしょうか?どなたかご指導のよろしくお願いします。 環境はWindowsXP、ActivePerl、Httpdです。 ************************ $words1 = "アイウカキクスセソタチツゼー" ; $compare = "タ" ; if( $words1 =~ /$compare/ ){ print "比較対象文字が含まれています。\n" ; } else{ print "比較対象文字は存在しません。\n" ; }

    • ベストアンサー
    • Perl
  • C#、Regex使用時の正規表現について

    ------------------------------------------------- おはようございます。 早速ですが質問させて頂きます。 現在、『C#でXMLファイルを読み込んで その中の文字を検索する』ということをしております。 ある行にXML表記で書かれた論理・比較演算子などがあり、 その演算子の数を制限させてみたいです。 ここで、演算子の数を数えるとき『MatchCollection』 を使用してカウントしているのですが、Regexの正規表現で "--"や"||"といった記号はどう検索させればよいのでしょうか。 例えば、インクリメントとデクリメントを検索しようとして Regex regex = new Regex("[--|++]"); のように書いてみても正しい数値が入っておりません。 まことに初歩の質問かもしれないので申し訳ないのですが、 どなたか方法をご存じの方がいらっしゃればご教示願いたいと思います。 宜しくお願い致します。

  • 正規表現の実行レポートは作成可能でしょうか?

    開発言語:Perl(Win32) ヴァージョン:5.8.4.810 perl.exeのプロパティー参照 長文の正規表現にパターンマッチを試みているのですが、 本来マッチするはずの文字列に対して、マッチしません。 しかし、正規表現が長文のため、なかなかデバッグが進みません。 どのように、パターンマッチが進んでいるか見ることが出来ればデバック作業が早くなると思うのですが、 私はその方法を知りません。 そこで、質問なのですが、Perlが正規表現をどのように解釈して、パターンマッチを進めているか、確認する方法はないのでしょうか? できれば、パターンマッチ実行中、解釈している位置と、文字列をレポートとして出力する方法があれば、それを知りたいと思います。

    • ベストアンサー
    • Perl
  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

  • 正規表現の逆?

    検索対象の文字列が、正規表現で言うなら あい(う|え)かきく(け|こ)さ・・・ という感じであります。 それを検索したい文字列(1000個程度)の入ったファイルを順に読み込み、マッチしたら切り出し、さらに検索を続けて切り出していくという処理をしたいのですが、何から手をつけていいかわかりません。 どなたか教えてください。

専門家に質問してみよう