2012-07-24 6 views
8

私は正規表現をより良くしようとしています。 (?> expression)の意味を理解しようとすると苦労しています。 backtackingしていないサブエクスプレッションに関する詳細はどこで見つけることができますか? THISリンクの説明は次のとおりです:非バックトラッキングサブ表現はどのように機能するのですか?(?> exp) "

貪欲な部分式、バックトラッキングのない部分式としても知られています。 これは1回だけ一致してから、 バックトラックに参加しません。

この他のリンク:http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspxはまた、非バックトラックの部分式の定義を持っていますが、私はまだそれが何を意味するのか理解に苦労していますプラス私は(?>exp)

答えて

9

を使用する例を考えることはできませんいつものように、regular-expressions.infoは良い場所です。

一度一致したものが一致したものであることを確認するには、アトミックグループを使用します。例えば

は、またはコロン、次に、スペースによって分離されなくてもよい「単語」の数と一致するように、ユーザは、正規表現を試みた:

(?:[A-Za-z0-9_.&,-]+\s*)+: 

一致があった場合、すべてが大丈夫でした。しかし、そうでないときは、PCが100%のCPU負荷で応答しなくなるのは、正規表現エンジンが次のコロンを一致させるための単語の組み合わせを見つけようとしないためです。もちろん不可能でした。原子群を使用することにより

は、これを防止されている可能性が:

(?>[A-Za-z0-9_.&,-]+\s*)+: 

今マッチした滞在一致したものは何でも - 無後戻りため、高速な失敗回。

8

正規表現のチュートリアルはここにページがあります。http://www.regular-expressions.info/atomic.html

は、基本的にはそれが何をするか破棄はa(?>bc|b)c試合abccなくabcことを意味し、情報をバックトラックされます。

bcとの一致が検出され、bc|bの代替に関するバックトラッキング情報が破棄されるため、2番目の文字列と一致しない理由があります。基本的には|bの部分を忘れてしまいます。したがって、bcの後にはcがなく、一致が失敗します。

原子グループを使用する最も便利な方法は、遅い正規表現を最適化することです。あなたは上記のページでより多くの情報を見つけることができます。

1

possessive quantifiers を読んでください。バックトラックエンジンは、一致した以前のすべてのステップに一致しなかった前のステップだけを記憶します。

これは、受け入れ可能なステップの可能性が高い場合に便利です。各ステップが可能なバックトラッキング回帰のために格納されている場合、メモリを消費します。

Possessive Quantifierは、アトミックグループの略語です。

関連する問題