2013-03-14 15 views
6

?>が正規表現で何のために使われているのか分かりません。たとえば、次のようPCRE正規表現では "?>"の意味は何ですか?

(?>[^()]+) 

私は?:はあなたが試合を参照バックアップするつもりはない場合、それは試合を格納してはならないことを意味していることを知っています。これは何らかの形で関連していますか?

これは正規表現にも関連していますか? (?P>name)または(?&name)

出典:patternにバックトラックhttp://php.net/manual/en/regexp.reference.recursive.php

+6

一度専用部分式http://php.net/manual/en/regexp.reference.onlyonce.php –

+1

または "アトミックグルーピング":http://www.regular-expressions.info/atomic .html –

+0

+1正規表現の構文を検索エンジンに含めることはもちろん、単純で包括的な正規表現のドキュメントを見つけるのは難しいでしょう。 – caiosm1005

答えて

8

(?>pattern)防ぎます。少なくとも2つの名前があります。非バックトラッキンググループ,アトミックグループです。それは最も記述的な名前なので、の非バックトラッキンググループと呼ぶことにします。

(?>[^()]+)だけでは、バックトラッキングを行わないようにする必要はありません。バックトラックを誘発してバックトラック以外の動作を示すことはできません。

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

ノーマルバージョン、^\([^()]+ため(a + bを試した後リテラル)は1つの文字で後戻りし、それはすべての可能性を排気した後に失敗した(a、まで(a +などで再試行します一致しません。

非バックトラッキングバージョンは、最初の試行の直後に(a + bで試合に失敗します。

非後戻り基は数量詞(?*+{n,}{n,m})によって誘導されるバックトラック減少させるのに主に有用です。非バックトラッキンググループの最適化のトリックは、正規表現エンジンが最初に試したことを知ることです。正規表現をシフトして、エンジンが最初に試した試行があなたがマッチさせたいものであることを確認してから、非バックトラッキングにすることができます。

非バックトラックグループと最適化の例としては:

  • How can I improve the performance of a .NET regular expression?

    私が引用問題は、.NETからですが、それは非バックトラックグループのために同じ構文を使用しています。

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

  • StackOverflowError when matching large input using RegEx

    別の例。所有者定量器(+を通常の定量器の後に加える。?+++*+など)、非バックトラッキンググループの動作は非バックトラッキングと同じですが、非バックトラッキンググループの構文では一般化できます。

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

関連する問題