拡張正規表現の特殊文字

昨日 id:otn:20060121 の続き。
grepRubyでいろいろ試してみると、やはり特殊文字の扱いに差がある。

$A

という正規表現は、grepでは、「$ A という2文字の並び」にマッチするが、egrep/Rubyだと何にマッチするか良くわからない。少なくとも「$ A という2文字の並び」にはマッチしない。Rubyで「改行 と A の2文字の並び」にもマッチしないようだ。egrep/Rubyでは「$ A という2文字の並び」にマッチする正規表現

\$A

である。


grep/egrep の正規表現/拡張正規表現では、特殊文字かどうかが文脈によって決まり、決まった場所以外では普通文字になる。これがもしかすると覚えにくいので、他言語では仕様を変えたのか?


grp/egrepの正規表現/拡張正規表現で、特殊文字になりうる文字が \ によるクォート以外で普通文字になる条件:

^ 文字クラス定義の中でかつその先頭でなければ普通文字
$ は正規表現の末尾以外では普通文字(grep)
$ は文字クラス定義の中では普通文字(egrep)
] は文字クラス定義開始の後方では文字クラスを閉じる特殊文字だが、 [ および [^ の直後では普通文字
- は文字クラス定義内では範囲を示す特殊文字だが、[ および [^ の直後 または文字クラスを閉じる ] の直前では普通文字
\ は文字クラス定義の中では普通文字
. は文字クラス定義の中では普通文字
繰り返し指定の * + ? { は正規表現の先頭では普通文字
} は繰り返し指定を開始する { の後方で繰り返し指定を閉じる場合以外は普通文字

やはり主として文字クラスがらみのようだ。何も見ずに書いているのでもれや間違いがあるかもしれない。指摘求む。