正規表現の先読みと後読み

すごく難しい。

肯定先読み

以下のパターンを考える。

以下の文字列はマッチしない

参照:https://regex101.com/r/ii0Brz/1

アルゴリズム

  • 123まではヒットしないのでスルー
  • Aがヒット
  • Bがヒット
  • Bがヒットした時点で、検索開始位置はBになる、これがCとヒットしないのでマッチしない。

このパターンはPositive Lookaheadと呼ばれる。日本語だと肯定先読み。意味としてはPositiveならそのまま進めるくらいの意味だと思う。

Bがヒットした時点で(?=)はパターンから消えて、パターンACが文字列BC456から検索されるといってもいい。

肯定後読み

同様にパターンA(?<=B)CABC456にマッチしない。参照:https://regex101.com/r/tEyPG2/1

アルゴリズム

  • Aがヒット
  • Bがヒット
  • Bがヒットした時点で、パターンのA、文字列のCから検索されてマッチしない。

別の言い方でまとめ直し

パターン A(?=B) は、
Aの次にBが来るもののA

パターン A(?=B)C は、
Aの次にBが来るもののA、の次にCが来るもの
よって絶対マッチしない。

パターン (?<=B)C は、
Cの前にBが来るもののC

パターン A(?<=B)C は、
Aの次に、Cの前にBが来るもののC
よって絶対マッチしない。