正規表現の肯定的先読みと後読みについてなのですが、
このようにすると既に読んだ部分に「jeff」という文字列があり、まだ読んでいない位置に「s」があればマッチし、jeffとsの間にアポロストロフィが追加されます。
s/(?<=jeff)(?=s)/'/
これを逆にすると
s/(?=s)(?<=jeff)/'/
まだ読んでいない部分にsがあって、既に読んだ部分にjeffがあったらマッチをする、と思っていたのですが、
下記の正規表現を確認してくれるサイトで試したところ、マッチしませんでした。
正規表現チェッカー
詳説正規表現第三版(62p)によれば、
s/(?=s\b)(?<=\bJeff)/'/g
はどのような挙動を示すか?
この場合、「(?=s\b)(?<=\bJeff)
」のどちらを先にするかはどうでもよいことだ。"右側をチェックしてから左側をチェック"しても、その逆でも、2つのチェックの組み合わせを成功させるためには、2つのチェックが同じ位置で成功しなければならないというところがポイントである。例えば、"Thoma▲s Jeff▲erson"という文字列には、「(?=s\b)
」も「(?<=\bJeff)
」もマッチするが(マークを付けた位置で)、両方が成功する同一地点は、存在しないので二つの組み合わせは、マッチに至らない。
これについて、"2つの組み合わせ"というちょっとあいまいな表現を使っていも、今のところはよいだろう。この場合なら、この表現の意味は直感的にわかる。しかし、正規表現エンジンが正規表現を適用する様子が必ずしも直感的にわかるとは言えない場合がときどきある。正規表現エンジンの挙動の仕組みは正規表現の本当の意味に現実的な影響を与えるので、4章では、これを正面から詳しく見ていくつもりだ。
正規表現は、左から右へ処理するので、左にまだ読んでいない部分があるのに、そのさきに既に読んだ部分という矛盾が
発生するから上手くマッチしないのか、と思っておるのですが、実際はどうなのでしょうか。