すごく難しい。
肯定先読み
以下のパターンを考える。
1 |
A(?=B)C |
以下の文字列はマッチしない
1 |
123ABC |
参照:https://regex101.com/r/ii0Brz/1
アルゴリズム
- 123まではヒットしないのでスルー
- Aがヒット
- Bがヒット
- Bがヒットした時点で、検索開始位置はBになる、これがCとヒットしないのでマッチしない。
このパターンはPositive Lookaheadと呼ばれる。日本語だと肯定先読み。意味としてはPositiveならそのまま進めるくらいの意味だと思う。
Bがヒットした時点で(?=)はパターンから消えて、パターンACが文字列BC456から検索されるといってもいい。
肯定後読み
同様にパターンA(?<=B)CはABC456にマッチしない。参照: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
よって絶対マッチしない。