10

?>正規表現で何に使われているのかわからないようです。たとえば、次のようになります。

(?>[^()]+)

?:これは、一致を逆参照しない場合は、一致を保存しないことを意味します。これはどういうわけか関連していますか?

これも正規表現と関係がありますか?(?P>name)また(?&name)

ソース: http: //php.net/manual/en/regexp.reference.recursive.php

4

1 に答える 1

10

(?>pattern)のバックトラックを防ぎpatternます。少なくとも2つの名前があります:非バックトラッキンググループアトミックグループ。これは最もわかりやすい名前であるため、非バックトラッキンググループと呼びます。

ただし、式(?>[^()]+)だけをバックトラックしないようにする必要はありません。バックトラックを誘発して非バックトラック動作を示すことができるものは何もありません。

より興味深い例は^\((?>[^()]+)\)、文字列と一致する正規表現で(a + b()あり、非バックトラッキンググループのない通常のバージョンと比較され^\([^()]+\)ます。

通常のバージョンでは、リテラルを一致させよう(a + bとして失敗した後、1文字ずつバックトラックし、などで再試行します。すべての可能性を使い果たした後、失敗します。^\([^()]+)(a +(a

非バックトラックバージョンは、を最初に試した直後に一致に失敗し(a + bます。

非バックトラッキンググループは、数量詞(、、、、、)によって引き起こされるバックトラッキングを減らすの?に最も*役立ち+ます。非バックトラッキンググループで最適化する秘訣は、正規表現エンジンによって行われた最初の試行を知ることです。エンジンによって行われた最初の試行が一致させたいものであることを確認するために、正規表現をシフトする必要がある場合があります。そうすれば、バックトラックしないようにすることができます。{n,}{n,m}

非バックトラッキンググループによる最適化の例として:

  • .NET正規表現のパフォーマンスを向上させるにはどうすればよいですか?

    私が引用する質問は.NETからのものですが、非バックトラッキンググループに対して同じ構文を使用しています。

    上記の質問では、元の正規表現には多くの使用法*+数量詞があります。一致が失敗すると不要なバックトラックが発生し、大きな入力のパフォーマンスに影響します。

  • RegExを使用して大きな入力を照合するときのStackOverflowError

    もう一つの例。所有+格数量詞(通常の数量詞の後に追加する?+、など)と非バックトラッキンググループは、非バックトラッキンググループと同じ動作をしますが、非バックトラッキンググループの構文だけで一般化できることに注意してください。++*+

    JavaのようにPHPでスタックオーバーフローが発生することはありませんが、長い文字列を検証するとパフォーマンスが向上するはずです。

于 2013-03-14T15:47:53.443 に答える