<b>billions<b>zillions</b>という文字列に対して<b>((?!</?b>).)*?</b>
という正規表現を使うと、
以下のような動作で合っておりますか。
また※1は、前者が合っているのでしょうか。それとも「billions」を正規表現で処理してから、否定先読みの効果で正規表現が失敗する後者が成功するのでしょうか。
カレントステート(▲)…正規表現を今まさに試みている位置。
△…正規表現を試みる開始位置。マッチしたところから始まる。
保存ステートリスト…
試されていない選択肢を再開するための正規表現内での位置と文字列内での位置の両方を反映したもの(詳説正規表現第三版154p)
- △▲<b>billions<b>zillions</b> ▲<b>((?!</?b>).)*?</b>
…まず「<、b、>」にマッチする。 - △<b>▲billions<b>zillions</b> <b>▲((?!</?b>).)*?</b>
…が、非貪欲的な*?
があるので「b」が((?!</?b>).)*?
にマッチするかどうか調べないので飛ばすが、何かあったときのために、保存ステートリストに「△<b>▲billions<b>zillions</b> <b>▲((?!</?b>).)*?</b>」を保存。保存後、正規表現のカレントステートが一個先にずれる。
- △<b>▲billions<b>zillions</b> <b>((?!</?b>).)*?▲</b>
…「b」と「<」は、マッチしない。正規表現が失敗したので保存ステートリストに保存しておいたやつのなかで、最も末尾にあたるものを使う。
- △<b>▲billions<b>zillions</b> <b>▲((?!</?b>).)*?</b>
※1…「b」とまだ読んでいない先に</b>或いは<b>が無くてかつ、任意の一文字が0文字以上、という正規表現は、マッチする。
- △<b>b▲illions<b>zillions</b> <b>((?!</?b>).)*?▲</b>
…非貪欲的な*?
があるので、「i」が((?!</?b>).)*?
にマッチするかどうか調べないで飛ばす。しかし「i」と「<」は、マッチしないので予め保存しておいた「△<b>b▲illions<b>zillions</b> <b>▲((?!</?b>).)*?</b>」を実行する。もちろんマッチする。残りの「l、l、i、o、n、s」までは、「b、i」と同じように処理が行われマッチする。
※1…否定先読みの効果で一気に二個目の<b>まで飛ばされるのか、任意の一文字を意味する.
にマッチする「billions」を正規表現で処理してから、否定先読みの効果で正規表現が失敗するのかがわからない。一応下記では、後者を採る。
- △<b>billions▲<b>zillions</b> <b>▲((?!</?b>).)*?</b>
…「l、l、i、o、n、s」のときと同じく非貪欲なので飛ばす。「△<b>billions▲<b>zillions</b> <b>▲((?!</?b>).)*?</b>」を保存。
- △<b>billions▲<b>zillions</b> <b>((?!</?b>).)*?▲</b>
…「<」と「<」は、マッチするが、「b」と「/」がマッチしないので失敗。
保存していたものを実行する。
- △<b>billions▲<b>zillions</b> <b>▲((?!</?b>).)*?</b>
まだ読んでいない先に「<、b、>」があるのでマッチ不成立となる。保存しているものもないので、正規表現を試みる開始位置△の位置でのマッチは、失敗。
- <△▲b>billions<b>zillions</b> ▲<b>((?!</?b>).)*?</b>
…「b」と「<」はマッチしないのでこの位置でも失敗。以降、「>、b、i、l、l、i、o、n、s」も失敗し、正規表現を試みる開始位置△、カレントステートとともに2個目の<b>の前の位置までくる。
- <b>billions△▲<b>zillions</b> ▲<b>((?!</?b>).)*?</b>
…「<、b、>」は、「<b>」にマッチする。
- <b>billions△<b>▲zillions</b> <b>▲((?!</?b>).)*?</b>
…先述の通り、非貪欲なので「z」が((?!</?b>).)*?
にマッチするかどうかを調べないで飛ばす。
「<b>billions△<b>▲zillions</b> <b>▲((?!</?b>).)*?</b>」を保存。もちろん「z」と「<」はマッチしないので保存していたものを処理する。
- <b>billions△<b>▲zillions</b> <b>▲((?!</?b>).)*?</b>
…「z」と((?!</?b>).)*?
は、マッチする。
- <b>billions△<b>z▲illions</b> <b>▲((?!</?b>).)*?</b>
…「z」のときと同じく非貪欲なので「i」と「<」を比べるがマッチしない。保存していた「<b>billions△<b>z▲illions</b> <b>▲((?!</?b>).)*?</b>」
を使う。マッチする。以後、「l、l、i、o、n、s」まで同じことを繰り返す。
- <b>billions△<b>zillions▲</b> <b>▲((?!</?b>).)*?</b>
…「<、b、>」がマッチするかどうか調べるが、非貪欲なので飛ばす。失敗してもよいように、「<b>billions△<b>zillions▲</b> <b>▲((?!</?b>).)*?</b>」を保存。
- <b>billions△<b>zillions▲</b> <b>((?!</?b>).)*?▲</b>
…マッチ。
- <b>billions△<b>zillions</b>▲ <b>((?!</?b>).)*?</b>▲
…正規表現の末尾まで来たので終了。
回答1件
あなたの回答
tips
プレビュー