6

のインスタンスを検索するために、おそらく大きなテキストブロックがあります[[...]]。ここでは、...他のブラケットを含め、何でもかまいません(ただし、ネストすることはできません。afterの最初のインスタンスは一致]][[終了します)。

このテキストに一致する2つの方法を考えることができます:

  • 欲張りでない修飾子の使用:/\[\[.+?\]\]/
  • 先読みの使用:/\[\[(?:(?!\]\]).)+\]\]/

パフォーマンスの観点から、1つの選択肢は本質的に他の選択肢よりも優れていますか(最初の選択肢の方がおそらく読みやすいと思います)?欲張りでない修飾子を使用しない方がよいと読んだことを思い出しますが、そのためのソースを今は見つけることができません。

4

4 に答える 4

6

この場合、貪欲でない数量詞を使用することをお勧めします。

この例の文字列を見てください"[[a]b]]"

欲張りでない数量詞

       \ [\ [。+?\] \]
アトム#1 2 3 4 5
  1. アトム#1\[が一致
  2. アトム#2\[の一致
  3. アトム#3.+?"a"
  4. アトム#4\]の一致
  5. アトム#5\]は失敗し、#3に戻りますが、ストリングの位置は維持されます
  6. アトム#3.+?"]"
  7. アトム#4\]は失敗し、#3に戻りますが、ストリングの位置は維持されます
  8. アトム#3.+?"b"
  9. アトム#4\]の一致
  10. アトム#5\]の一致
  11. 成功

先のことを考える:

       \ [\ [(?:(?!\] \])。)+ \] \]
アトム#1 2 3 4 5 6 7
  1. アトム#1\[が一致
  2. アトム#2\[の一致
  3. アトム#4(?!\]\])はすぐに成功します(つまり、一致しません)"a"、続行します
  4. アトム#5.は一致し"a"、#3で繰り返します
  5. アトム#4(?!\]\])はで部分一致を達成します"]"
  6. アトム#4(?!\]\])はで成功します(つまり、一致しません)"b"、続行します
  7. アトム#5.は一致し"]"、#3で繰り返します
  8. アトム#4(?!\]\])はすぐに成功します(つまり、一致しません)"b"、続行します
  9. アトム#5.は一致し"b"、#3で繰り返します
  10. アトム#4(?!\]\])はで部分一致を達成します"]"
  11. アトム#4は、エルゴ(?!\]\])で完全一致を達成します:#4は失敗し、#3を終了します"]"
  12. アトム#6\]の一致
  13. アトム#7\]の一致
  14. 成功

したがって、欲張りでない数量詞は、やるべきことが少ないように見えます。

免責事項:これは人為的な例であり、入力、実際の式、および正規表現エンジンの実装によって、実際のパフォーマンスが異なる場合があります。ここで概説したのは実際に起こっていることであると私は98%しか確信していないので、訂正の余地があります。また、すべてのパフォーマンスのヒントと同様に、これを額面どおりに受け取らないでください。確実に知りたい場合は、独自のベンチマーク比較を行ってください。

于 2010-06-04T16:53:25.790 に答える
3

別のバリアント:/\[\[((?:\]?[^]])+)]]/

欲張りでない数量詞も先読みも使用しません。]非の前にシングルを許可します]。順番に2つある場合]、内側の繰り返しは停止し、試合は終了します。

このパターンは、FSAコンパイルの正規表現エンジンで使用するのに最適です。バックトラッキングエンジンでは、欲張りでないバリアントよりも遅くなる可能性があります。

于 2010-06-04T17:22:40.743 に答える
1

どの正規表現フレーバーを使用していますか?所有格の数量詞をサポートするものであれば、はるかに優れた代替手段があります。

\[\[(?:[^\]]++|\](?!\]))*+\]\]

[^\]]++]バックトラックを可能にする状態情報以外の文字を飲み込み、わざわざ保存することはありません。が表示された場合]は、先読みを実行して別のが存在するかどうかを確認します。全体を別の所有格数量詞でラップするということは、を見るたびに先読みを行うだけであり]、1回だけバックトラックすることを意味し]]ます。

所有格の数量詞は、Java、JGSoft、PCRE(PHP)、鬼車(Ruby 1.9)、およびPerl5.12フレーバーでサポートされています。これらのフレーバーはすべて、同じ効果を達成するために使用できる原子グループもサポートしています。

\[\[(?>(?:(?>[^\]]+)|\](?!\]))*)\]\]

.NETフレーバーはアトミックグループをサポートしますが、所有格の数量詞はサポートしません。

于 2010-06-04T19:22:08.407 に答える
0

欲張りでない修飾子を使用する方が良いと思います。あなたが読んだ記事が「欲張りマッチングに注意してください」と言っていなかったのは確かですか?

于 2010-06-04T16:26:20.893 に答える