2011-06-27 15 views
6
  1. 原子グループを理解する方法が不思議でした。(?>expr)で表されますか?それは何ですか? のために使用されますか? http://www.regular-expressions.info/atomic.html原子グループと非捕獲グループ

    exprは、正規表現として 交替、 a(?>bc|b)c一致abccなく abcとき単なる例です。 exprに例がありますか?

  2. 原子団と非捕捉者はグループで、(?:expr), と同じもので表されますか?

私はRegexの特定のフレーバーに限定しているわけではありません。

答えて

5

アトミックグループ(およびpossessive modifier)は、悪意のあるユーザーが悪意のあるユーザーが悪意のあるユーザーに悪用され、サーバーのメモリを盗むことによってサービス不能攻撃を引き起こす可能性があります。

非キャプチャグループはまったく非キャプチャです。正規表現エンジンは、キャプチャしていないグループに戻ることができます。原子団にはなりません。

+0

ありがとうございます!原子団と所有修飾子の違いは何ですか?彼らは同じ目的のためですか? – Tim

+0

所有修飾子は原子の単なる構文上の砂糖です: '(?:a | b)* +'は '(?>(?:a | b)*)'と等価です。 –

6

1)Atomicグループを使用すると、完全正規表現が指定された文字列と一致していない場合、正規表現エンジンはさらに順列を戻しません。交替を使用するときはいつでも、マッチが成功すると、正規表現は残りの式との一致を直ちに試みますが、他の交替が可能な位置を追跡します。残りの式が一致しない場合、正規表現は以前に指摘された位置に戻り、他の組み合わせを試します。 Atomicグループを使用していた場合、正規表現エンジンはではなく、は以前の位置を追跡していて、一致を諦めてしまいます。上記の例では、Atomicグループを使用する目的を実際に説明していません。これは、バックトラックの排除を明確に示しています。グリーディー量量子が使用され、交替がないにもかかわらずさらなる組み合わせが可能である特定のシナリオでは、アトムグループが使用されます。

2)原子グループと非捕獲グループは異なります。非キャプチャグループは単にマッチの値を保存しません。アトミックグループは、さらなる組み合わせが必要な場合にバックトラックを無効にするだけです。例えば

、正規表現(マッチを捕捉せず)a(?:bc|b)cマッチabccabc両方、a(?>bc|c)cのみabccと一致しながら。正規表現がa(?>b|bc)cだった場合は、abcと一致しますが、a(?:b|bc)cはまだ両方とも一致します。

+2

Atomicグループもキャプチャしていないことを忘れないでください! – robinCTS

関連する問題