0

Jeffrey Friedl の本 Mastering Regular Expressions 3rd Ed を読んでいます。274 ページで、Jeffrey は読者に正規表現 /x([^/]|[^x]/)*x/ が文字列 (太字でマークされた一致文字) に一致する理由を調査するように依頼しまし365; /x うるう年でないことを前提とする x/ ".

正規表現から末尾のx/を削除しました。したがって、正規表現/x([^/]|[^x]/)*の出力は"/x division x//365; "です。しかし、x/を追加し直した後、正規表現/x([^/]|[^x]/)*x/の出力は"/x 除算 x//365; /x うるう年ではない x/" となります.

Perl の正規表現エンジンの末尾x/のバックトラッキング手順を誰か教えてくれませんか?

これが、この質問に対する私の perl スクリプトです。

my $str = "years = days /x divide x//365; /x assume non-leap year x/";
if ($str =~ m{(/x([^/]|[^x]/)*)}) {
    print "\$1: '$1'\n"; # output: $1: '/x divide x//365; '
} else {
    print "not matched.\n";
}


$str = "years = days /x divide x//365; /x assume non-leap year x/";
if ($str =~ m{(/x([^/]|[^x]/)*x/)}) {
    print "\$1: '$1'\n"; # output: $1: '/x divide x//365; /x assume non-leap year x/'
} else {
    print "not matched.\n";
}
4

2 に答える 2

2

要約は次のとおりです。

/ x- /の後にxを一致させます
([^ /] | [^ x] /)* -/以外のすべてに一致するか、xの後にスラッシュを付けないものに一致します-可能な限り
x/ - xの後に/を続ける

つまり、基本的には次のようになります。で始まり/x、次に、以外のすべてに一致しx/、で終了しx/ます。

于 2012-06-26T04:20:05.040 に答える
0

わかった。ジョセフは正しいです。2番目の「/x」のマッチングが失敗すると、正規表現エンジンは「/ x」に戻って試行し、成功します。

于 2012-06-27T00:51:41.400 に答える