Perl正規表現は、できるだけ早く成功するよりも、できるだけ早く失敗するように最適化されています。これは、大規模なログファイルをグレープするときには非常に意味があります。
文字列の定数部分を最初に検索する最適化があります。この場合、「浮動」b
またはbb
です。これは、バックトラッキング状態を追跡することなく、むしろ効率的にチェックすることができます。いいえbb
が見つかり、一致がすぐに中止されます。
あまりにもb
で。その浮動部分文字列が見つけられ、そこでマッチが構築されます。ここで正規表現マッチのデバッグ出力は、(プログラムが"aaab" =~ /a*b/
である)である:
Compiling REx "a*b"
synthetic stclass "ANYOF_SYNTHETIC[ab][]".
Final program:
1: STAR (4)
2: EXACT <a> (0)
4: EXACT <b> (6)
6: END (0)
floating "b" at 0..2147483647 (checking floating) stclass ANYOF_SYNTHETIC[ab][] minlen 1
Guessing start of match in sv for REx "a*b" against "aaab"
Found floating substr "b" at offset 3...
start_shift: 0 check_at: 3 s: 0 endpos: 4 checked_upto: 0
Does not contradict STCLASS...
Guessed: match at offset 0
Matching REx "a*b" against "aaab"
Matching stclass ANYOF_SYNTHETIC[ab][] against "aaab" (4 bytes)
0 <> <aaab> | 1:STAR(4)
EXACT <a> can match 3 times out of 2147483647...
3 <aaa> <b> | 4: EXACT <b>(6)
4 <aaab> <> | 6: END(0)
Match successful!
Freeing REx: "a*b"
あなたはre
プラグマのdebug
オプションを指定して、このような出力を得ることができます。
厳密に言えば、b
またはbb
を見つけることは必要ありませんが、一致がずっと早く失敗することができます。
'<'は必要ありません。これは '-n'フラグがあなたのために暗黙的に行うことです。 – squiguy
回答者とコメント投稿者の両方に感謝します。私は1つの答えしか受け入れることができませんが、私は両方を受け入れるべきでした。 –