2012-01-21 16 views
0

私はとの差に明確ではない午前:どちらも同じ出力を生成するだけで最初の式が後方参照のために使用することができるように私には思える
(...)

(?:...)正規表現の違い

正しいですか?これが本当に唯一の違いなら、なぜ2番目のオプションを使用するのでしょうか?
パフォーマンス用ですか?

答えて

1

これは正しいです - パフォーマンスが主な理由です。また、ネストグループのようなことをしているとき。後で使用するために「良い」キャプチャグループを用意したいと思うかもしれませんが、|オペレータのようなものをグループ化する必要もあります。同様に、すでにキャプチャグループを持っている正規表現を編集していて、グループ化を追加したいが既存のキャプチャグループに影響を与えたくない場合は、同様に非キャプチャグループを使用することができます。

2

これは正しいです。 (?:...)は実際にの非キャプチャグループであり、後方参照には使用できません。なぜ非キャプチャグループが使用される理由は、正規表現の特定のセグメントをまとめてグループ化したいが、実際にそれらを捕捉したくない場合が多いためです。 DO:

  • 使用(...)あなたがグループあなたの正規表現のセグメントをしたいとはあなたの正規表現のセグメントとがグループに
  • をキャプチャしたくないグループをしたいときがグループ
  • に使用(?:...)をキャプチャしたいとき
1

はい、これは唯一の違いです。パフォーマンスと可読性(つまり、あなたの意思を明確にする)と、場合によっては逆参照を無駄にしないこと(9つしかない)は、2番目の構文を使用する理由になります。

2

逆参照は、驚くほど高いパフォーマンスの影響を与えます。後方参照のない正規表現は、実行するO(string_length)であるDFAとして実装できます。後方参照では、最悪の場合の指数実行時間(最良の場合はかなり速くなる可能性があります)を持つNFAでなければなりません。

http://swtch.com/~rsc/regexp/regexp1.htmlおよびhttps://softwareengineering.stackexchange.com/questions/75606/advantages-disadvantages-of-nfa-over-dfa-and-vice-versaさらに詳細があります。