電子書籍の厳選無料作品が豊富!

--ここから引用
SFC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c /
missing.c msg.c node.c re.c version.c

この種の"変数=値"という形式の代入行は、「^\w+=.*」でマッチさせたいところだが、この正規表現は後続行を認識しない。
継続行にマッチさせるために、正規表現に「(\\\n.*)*」を追加して、「^\w+=.*(\\\n.*)*」としてみたらどうだろうか。一見したところ、エスケープされた改行の後に続く限り、
論理行がいくつあっても許されるように思われる。しかし、従来型NFAでは、この正規表現はうまく機能しない。最初の「.*」が開業にたどり着いたときには、すでにバックスラッシュは通り過ぎており、
追加された部分は、「.*」に強制的にバックトラックさせるだけの力を持っていない。
--ここまで引用(詳説正規表現より)

ここで質問ですが、なぜ追加された部分である「(\\\n.*)*」は、バックトラックさせるほどの力を持っていないのでしょうか。

またこの場合、バックトラックさせたい位置は、一行目と二行目を繋げているバックスラッシュの前までで合っておりますか。

A 回答 (1件)

誤 SFC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c /


正 SFC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \

> なぜ追加された部分である「(\\\n.*)*」は、バックトラックさせるほどの力を持っていないのでしょうか。

最後に「*」が付いているので、「長さ0の文字列」にマッチ可能だからです。その場合「.*」が抱え込んだ文字列から文字を奪い取る必要がありません。

参照148pの4.2.4.2項の「バックトラックさせるほどの力を持っている例」と比較すればわかり易いですね。
例えば、「(\\\n.*)+」であればバックトラックさせる力を持つことになります。


> バックトラックさせたい位置は、一行目と二行目を繋げているバックスラッシュの前までで合っておりますか。

「(\\\n.*)」が何にマッチするかを考えれば、自ずと明らかになるはずです。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!