9

オプションの非キャプチャ グループは冗長ですか?

次の正規表現です:

(?:wo)?men

次の正規表現と意味的に同等ですか?

(wo)?men
4

1 に答える 1

12

あなたの(?:wo)?men(wo)?menは意味的には同等ですが、技術的には異なります。つまり、最初は非キャプチャ グループを使用し、もう 1 つはキャプチャ グループを使用しています。したがって、問題は、キャプチャ グループがあるのに、なぜ非キャプチャ グループを使用するのかということです。

非キャプチャ グループが役立つ場合があります。

  1. 過剰な数の後方参照を避けるため (9 を超える後方参照を使用するのが難しい場合があることに注意してください)
  2. 99 個の番号付き後方参照制限の問題を回避するには (番号付きキャプチャ グループの数を減らすことにより) (ソース: Regular-expressions.info :ほとんどの正規表現フレーバーは、最大 99 個のキャプチャ グループと 2 桁の後方参照をサポートします。) Java 正規表現エンジンでも、PHP または .NET 正規表現エンジンでもありません。
  3. キャプチャをスタックに格納することによって発生するオーバーヘッドを軽減するには
  4. グループをキャプチャする順序を損なうことなく、既存の正規表現にグループを追加できます。

また、マッチをよりクリーンにするだけです:

非キャプチャ グループを使用して、組織化またはグループ化の利点を保持できますが、キャプチャのオーバーヘッドはありません。

既存の正規表現をリファクタリングしてキャプチャ グループを非キャプチャ グループに変換することは、コードを台無しにしたり、多大な労力を必要とする可能性があるため、良い考えではないようです。

于 2015-07-19T11:08:39.663 に答える