10

私は正規表現をもっと上手にしようとしています。の意味を理解するのに苦労してい(?> expression )ます。非バックタッキング サブエクスプレッションに関する詳しい情報はどこで入手できますか? このリンクの説明には次のように書かれています。

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

この他のリンク:http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspxには非バックトラッキング部分式の定義もありますが、それが何であるかを理解するのにまだ苦労していますプラスを意味します。使用する例が思いつきません(?>exp)

4

3 に答える 3

11

いつものように、regular-expressions.infoは始めるのに適した場所です。

一度一致したものを確実に一致させたい場合は、アトミック グループを使用します。

たとえば、スペースで区切られている場合と区切られていない場合があり、その後にコロンが続く「単語」の数を一致させるために、ユーザーは次の正規表現を試しました。

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

試合があったときは、すべてが順調でした。しかし、それがないと、彼の PC は 100% の CPU 負荷で応答しなくなります。これは、正規表現エンジンが次のコロンを一致させる単語の一致する組み合わせを無駄に見つけようとするため、壊滅的なバックトラッキングが発生するためです。これはもちろん不可能でした。

アトミック グループを使用することで、これを防ぐことができた可能性があります。

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

これで、一致したものはすべて一致したままになります。後戻りがないため、失敗する時間が短くなります。

私が最近見つけた別の良い例:

ASCII 文字が続かないすべての数字に一致させたい場合は、正規表現を使用することをお勧めします\d+(?![A-Za-z])。ただし、次の文字が文字でなくなるまで123a正規表現エンジンがバックトラックして一致を返すため、これは次のような入力では失敗します。12を使用する(?>\d+)(?![A-Za-z])と、このようなことはありません。(もちろん、\d+(?![\dA-Za-z])動作します)

于 2012-07-24T13:54:00.547 に答える
8

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

基本的に、それが行うことは、バックトラッキング情報を破棄するa(?>bc|b)cことabccですabc

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

アトミック グループを使用する最も便利な方法は、低速の正規表現を最適化することです。上記のページで詳細を確認できます。

于 2012-07-24T13:54:17.060 に答える
1

所有量指定子[a-z]*+調べて、一致した前のステップのすべてではなく、一致した前のステップのみをバックトラッキング エンジンに記憶させます。

これは、多くの許容可能なステップが発生する可能性が高く、各ステップがバックトラッキング回帰のために保存されている場合にメモリを消費する場合に役立ちます。

所有量指定子は、アトミック グループの省略形です。

于 2012-07-24T13:55:04.623 に答える