2007年11月22日木曜日

正規表現の縦棒

正規表現で|といえば選択を示している。
ただ選択の範囲はどこまで?正規表現をずいぶん使っていないのでさっぱり忘れてしまいました。ちょっと復習。
「詳説 正規表現」のP.13では、「Bob|Robert」は、BobとRobertのいずれかとマッチするとのこと。
「grey|gray」は「gr[ea]y」とも「gr(a|e)y」ともかける、と、このときの丸括弧は選択肢を括るものだと。このときは、|の及ぶ範囲の制限で()を越えられないということのよう。これをかかないで「gra|ey」と書くと、graもしくはeyにマッチする、と。そういえばそうだったかも。
メールデータのエントリを抜き出す際の例
「^(From|Subject|Date):~」は、行頭に
From:~
Subject:~
Date:~
にマッチするものが引っかかるのだそうだ。
% egrep '^(From|Subject|Date): ' mailbox のように使うのだそうだ。

>>脇道
 参考までに、()は、選択の範囲限定の他に、前方参照という機能もあるとのこと
 正規表現を()でくくった場合、正規表現の()に続く後ろの方で\1というようにマッチしたカッコの正規表現をさらにマッチ要素と使えるとのこと。 「([a-z]+) +\1」と書くと同じ単語が連続しているところをチェックできるのだそうだ。さらに、()は置き換えを行う場合の部分マッチの格納のようにも使えるとのこと。置き換えする際の\1,\2というのは、正規表現で用いたカッコ部分のマッチのみと展開できるとのこと。このときの\に続く数字は、(が現れる順番の部分マッチと対応するとのこと。
>>脇道終わり。
さらにP.92では、正規表現「|」は高レベルの構造(つまり優先度が低い)とのことで、「this and|or that」は、「(this and)|(or that)」となるとのこと。例外としては、lexツールで、「^this|that$」については、大半のツールでは「(^this)|(that$)」つまり『行頭にthisか、文末のthat』にマッチするが、lexでは、「^(this|that)$」つまり『行頭にthisまたはthatであり続いて文末』とマッチするようです。
さらに微妙な問題として、p.124 「tour|to|tournament」の正規表現を「three tournaments won」にかけたとき何とマッチするかというと。。。。正規表現の実装により異なるそうです。NFAで作られていると、tourがマッチする。(順番の先頭の物がマッチするから)で、DFAで作られているとtournamentがマッチするようです。

。。。正規表現は難しい。

0 件のコメント: