2016-05-07 4 views
1

私は電子メールアドレスを検証するための簡単な正規表現パターンを使用するには、私はこのパターンを見つけました:私はregex101上のパターンをチェックすると、予想通りJS、正規表現、奇妙な行動

^[^@][email protected][^@]+\.[^@]+$ 

それは(それがために一致しなくなります意味振る舞います例[email protected])。

だから、次の行:

/^[^@][email protected][^@]+\.[^@]+$/.test('[email protected]'); // false 

しかし:

let patt = new RegExp('^[^@][email protected][^@]+\.[^@]+$'); 
patt.test('[email protected]'); // true 

何?、私はクロムとFirefoxでテストしましたが、同じ動作です、誰も説明できますか?

+1

を '\ .'それは文字列リテラルでよりも正規表現リテラルで別の何かを意味します。 –

+1

'/^[^@][email protected][^@]+\.[^@]+$/.source!== '^ [^ @] + @ [^ @] + \。[^ @] + $ ' – Oriol

答えて

0

\.はの文字列リテラルの有効なエスケープシーケンスではなく、単に.に解決されます。すなわち、第2の例では、使用している正規表現は

^[^@][email protected][^@]+.[^@]+$ 

そして.マッチ任意の文字と等価であることを意味します。

コンソールに正規表現の両方をログに記録している場合は、簡単に違いを見ることができます:

enter image description here

+0

私はそれについて考えていないと思っていません、ありがとう、説明を愛して: –

0

問題が\.があなたの正規表現で.として評価されていることです。言い換えれば、あなたの正規表現が効果的である:^[^@][email protected][^@]+.[^@]+$

修正するには、//正規表現区切り文字を使用します。

patt = /^[^@][email protected][^@]+\.[^@]+$/ 
patt.test("[email protected]") // false 
patt.test("[email protected]") // true 
+0

または 'patt = new RegExp('^[^ @] + @ [^ @] + \\。[^ @ ] + $ ') ' –