詳説正規表現第四章157pにて*と+のバックトラックの仕組みについて解説している箇所の一節に分からないとこがありました。
「
x*」が「x?x?x?x?x?x?…」(より正確には「(x(x(x(x…?)?)?)?)?」のようなものだと考えれば、これまでに見てきたものと大きな違いはない。
エンジンは、スターの対象となっている要素をチェックする前に、チェックが不成功になったら(あるいは最終的に不成功だとわかったら)、スターの後ろの物をチェックするためのステートを保存する。このステートの保存は、スターによるくりかえしマッチが不成功になるまで続く。
上記の(x(x(x(x…?)?)?)?)?の動作についての疑問です。xの部分に対し任意の文字を意味する.に変更したうえで、文字列「123456789」を置換したとすると
(.(.(.(.?)?)?)?)? ↓ 「$1」と「$2」と「$3」と「$4」と「$5」(←のように置換したとすると…) ↓ 「1234」と「234」と「34」と「4」
となります。$1の場合は、最も外側のカッコが1234をキャプチャし、最も外側のカッコに内包されている子カッコが234、その子括弧に内包されているカッコが34、最深部のカッコが「4」です。
文字列123456789に(.(.(.(.?)?)?)?)?をマッチさせるとき、マッチが開始した現在の状態(カレントステート▲)は、下記になります。
▲123456789 ▲(.(.(.(.?)?)?)?)?…「1」が任意の文字にマッチするか調べるが、マッチに失敗したときのために、「▲123456789」は、「(.▲(.(.(.?)?)?)?)?」にマッチするか?を保存。数字の「1」は、ドットにマッチ。
1▲23456789 (.▲(.(.(.?)?)?)?)?…「2」が任意の文字にマッチするか調べるが、マッチに失敗したときのために、「1▲23456789」は、「(.(.▲(.(.?)?)?)?)?」にマッチするか?を保存。数字の「2」は、ドットにマッチ。
...以下同じような動作。
マトリョーシカのようにカッコがカッコを内包しているときの正規表現の動きは、上記の形であっているのでしょうか。
回答2件
あなたの回答
tips
プレビュー