はい、正規表現エンジンは v8 以降大幅に改善されました。v10 だけで、次のことがわかりました。
- パターン再帰
- 名前付きキャプチャ
- 所有量指定子
(*FAIL)
またはのようなバックトラック制御動詞(*SKIP)
。
\K
オペレーター_
- …その他
また、より多くの内部が Unicode 対応になりました。
v12 では、Unicode サポートがクリーンアップされました。正規表現の\p
and\X
演算子が大幅に強化されました。
v14 では、Unicode サポートが 6.0 に引き上げられました。オペレーターの文字\N
名が改善されました (charnames
プラグマも参照)。新しい文字モデルは、任意の符号なし整数をコードポイントとして扱うことができます。正規表現エンジンでは、
/u
正規表現は、/d
、/l
、 、/a
などのcharclass 修飾子を保持できるようになり/aa
ました。
- との非破壊置換
/r
が実装されました。
- RE エンジンは再入可能になったため、組み込みコードで正規表現を使用できます。
\p
クリーンアップされました
- Unicode セマンティクスへの切り替えが必要な場合は、正規表現のコンパイルが高速になります。
v16 では、perl は Unicode 6.1 をほぼサポートしています。正規表現エンジンでは、
- 文字クラスの効率
\p
が向上しました。
- さまざまな正規表現のバグ (多くの場合、大文字と小文字を区別しない一致を含む) が修正されました。
明らかに、これらの機能のすべてに代償が伴うわけではありませんが、特に Unicode 対応は内部をより複雑にし、遅くします。
また、手を放棄して、スクリプトの実行時間が perl5 v8 x86 から perl5 v16 x64 に倍増したと述べることもできません。変数が多すぎます:
- 両方の Perl は同じフラグでコンパイルされましたか?
- どちらも perl スレッド化された perl です (スレッド化サポートを無効にすると高速になります)
- あなたの整数の大きさは?64ビットか32ビットか?
- どのコンパイラの最適化が選択されましたか?
- 以前の Perl にはディストリビューション固有のパッチが適用されていましたか?
基本的に、出力全体を比較する必要がありperl -V
ます。
正規表現でパフォーマンスの上限に達している場合、それらは広範な解析には不適切なツールである可能性があります。少なくとも、新しい機能を使用して正規表現を最適化し、バックトラッキングを排除することができます。
(?{...})
構文解析コードが (大まかに) 文脈自由言語 (つまり、(?=...)
や関連する正規表現機能を使用しない) を記述し、構文解析がツリーの生成などを意味する場合、 Marpa::R2は処理をかなり高速化する可能性があります。