ちょっとずつ進む

常にWhat's upの精神

肯定的先読み・否定的先読みとは

肯定的先読み・否定的先読みを理解するにはアンカーという概念が重要らしい。

下記のqiitaの記事によると(記事自体は少し間違っているらしいので、コメントの説明をよく読んだほうが良き。)、アンカーも他の正規表現のメタ文字とかと同じようにマッチするか判定されているだけらしい。 https://qiita.com/mochizukikotaro/items/84f3ab2740b8efbe0dc6   

例えば、下記正規表現は普通に数字にマッチするかを考えて、その後に年が続いているかを考えれば良い。(実際には正規表現エンジンで解析されるときは、年からマッチしているか判定して、その後に数字がマッチしているか判定しているかもしれないが、まぁ正規表現組み立てるときはそこは意識しないでいいと思う。)

平成31年3月16日 // これに対して

\d+(?=年)     // この正規表現で検索すると31の部分がマッチする。

否定的先読みの場合は下記。

平成31年3月16日 // これに対して

\d+(?!年)     // この正規表現で検索すると平成「31」の「3」と「3月」の「3」と16の部分がマッチする。

\d+(?=年)って書くと先に「年」がマッチすると判定しているのかと思っていたが、そう考えないでよさそう。

内部的にはそうだとしても正規表現組み立てるときは、普通に、「数字が1文字以上続いていて、その後ろに年ていう文字列が来るものと一致する〜」とか考えれば良さげ。

てかそういうふうに考えないと、年の直前にマッチしてその年の前に数字がなんこならんでいるか一つづつチェックしているのか??とか考えながら正規表現組み立てようと思ったらよくわかんなくなる気がする。

正規表現の説明考えてたら疲れた。 パソコン疲れる。

ちなみに後読みは条件を満たすものの直後がマッチした位置になる。