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";
}