このページ(およびその他のページ)によると、DFA 正規表現エンジンはグループのキャプチャをかなりうまく処理できます。アトミック グループ (または所有量指定子) に興味があります。最近よく使用していて、これがどのように行われるのか想像もつかないからです。
私は答えの最初の部分に同意しません:
DFA は、アトミック グループ化のような構造を処理する必要はありません.... アトミック グループ化は、エンジンが一致を完了するのを支援する方法です。
アトミック グループは、NFA エンジンの速度にとって重要であるだけでなく、より単純でエラーが発生しにくい正規表現を作成することもできます。プログラム内のすべての C スタイルの複数行コメントを見つける必要があるとしましょう。正確な正規表現は次のようになります。
- 文字通りから始める
/*
- 以下のものを何でも食べる
- を除く任意の文字
*
- a の
*
後に何かが続く/
- を除く任意の文字
- これをできるだけ繰り返す
- 文字で終わる
*/
これは少し複雑に聞こえますが、正規表現は
/\* ( [^*] | \*[^/] )+ \*/
複雑で間違っています (正しく処理されません/* foo **/
)。気が進まない (怠惰な) 量指定子を使用する方が良い
/\* .*? \*/
しかし、それはライン全体を食べることができるので間違っています
/* foo */ @#$!!**@#$ /* bar */
ガベージで失敗した後の部分式によるバックトラックが発生した場合。上記を原子グループに入れると、問題がうまく解決されます。
(?> /\* .*? \*/ )
これは常に機能し (願っています)、可能な限り高速です (NFA の場合)。だから、DFAエンジンでどうにか扱えるのだろうか。