アプリ版:「スタンプのみでお礼する」機能のリリースについて

Perlの正規表現で、「)」(カッコ閉じ)は、「(」(カッコ開け)同様メタ文字で、もし/)/のようなマッチ演算子を書いて、「)」という文字列を検索しようとすると、Unmatched ) in regexというエラーになります。

しかし、「]」(角カッコ閉じ)や、「}」(中かっこ閉じ)は、メタ文字ではなく、/]/、/}/のようなマッチ演算子は正当で、それぞれ]、}をきちんと検索するのです。
「[」(角カッコ開け、文字クラスを作る)や、「{」(中かっこ開け)はメタ文字なのに、です。

開けがこないのに閉じが来た場合、]と}はエラーにならないのに、)だけはエラーになります。
これは、なぜでしょうか。

A 回答 (4件)

No2さんのが近いと思いますが、() はその内部に任意の正規表現を書けるからでしょう。



/a)b/ が /a\)b/のように解釈されOKだとして、それを() で囲もうとした途端に破綻します。

/(a)b)/ はどう解釈すれば良いでしょうか?あるいは、このときは /(a\)b)/ と書かないとエラーにしますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/05 06:29

ちょろっと調べてみると ] や } を「メタ文字」とはしていない資料があったりする....



ちなみに { は微妙な扱いだったりするのが難しいところ.
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/05 12:29

詳しく調べたわけではありませんが


() は入れ子に使われるので、正規表現の構文解析方法が []や{}と違うからではないか、と思います。
メタ文字としての{}の中には数字、カンマ、特定の文字列しか入りません。
メタ文字[]の中も特殊なのは[や[^の直後の]と [:文字クラス:] があるだけです。

対して、()はいくらでも入れ子にできます。
[]や{}のような単純なルールの適用は難しいです。
「この場合は ) は通常の文字」とかいうルールを書きだしていったら、わけわからなくなると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/05 06:27

そりゃ簡単な事でんがな!


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

この回答への補足

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

補足日時:2014/08/04 14:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!