2016-12-21 8 views
3

文字列から@[email protected]と一致する必要があります。だから私は次の正規表現を使いました。これは、より良い非貪欲な正規表現または否定の文字クラスですか?

^@.*[email protected] 

または

^@[^@]*@ 

両方の方法それが仕事だが、私は1つが、より良い解決策になるかを知るしたいと思います。正規表現を非貪欲な繰り返しまたは正規表現の否定文字クラスで正規表現?

+1

'^ @ [^ @] * @'オプションがはるかに優れていることは明らかです。 –

答えて

4

否定文字クラスは通常、怠惰なマッチングの上に好まれるべきです。

正規表現に成功した場合^@.*[email protected]@ sの各文字のために拡大する必要がある一方で、^@[^@]*@は、単一のステップで@ sの間でコンテンツを一致させることができます。

(無エンディング@の場合のために)失敗した場合、ほとんどの正規表現エンジンは少し魔法を適用すると、内部@と非@の間に明確な境界線があるとして、[^@]*+として[^@]*を扱い、これはにマッチします文字列の末尾には、末尾にない@が認識されますが、すぐには失敗します。 .*?は通常どおり文字のために文字を展開します。

大きな文脈で使用すると、[^@]*は、末尾の境界を越えて決して拡大されません。@これは、レイジーマッチングでは非常に有効です。例えば。 ^@[^@]*a[^@]*@@[email protected]@と一致せず、^@.*?a.*[email protected]は一致しません。

[^@]は改行と一致しますが、.は(ほとんどの正規表現エンジンではシングルラインモードで使用されていない限り)一致します。これを避けるには、改行文字を否定に追加します(必要がない場合)。

+0

ありがとうございます:) –

+1

* '[^ @]'は改行にもマッチしますが、 '.'は正規表現のフレーバを指定しなければ真ではありません。POSIX、TRE、Tcl(Henry Spencerのregexライブラリ)の正規表現のフレーバでは、ドットがデフォルトで改行シンボルに一致します。 –

4

明らかに、^@[^@]*@オプションがはるかに優れています。

ネゲートされた文字クラスは、greedilyとなります。つまり、正規表現エンジンは、できるだけ多くの文字を@以外で0個以上取得します。 this regex demoとのマッチングを参照してください。

enter image description here

あなたが怠惰なドットマッチングパターンを使用する場合、エンジンは@と一致し、そして(.*?をスキップ)末尾@を一致させようとします。インデックス1に@が見つからないため、.*?a charと一致します。この.*?パターンは、最初に@まで@以外の文字があるので、が何度も展開されます。

ここlazy dot matching based pattern demo hereとが一致した段階で参照してください。可能なら

enter image description here

関連する問題