2016-05-07 18 views
1

ich einfach regexp Muster verwenden E-Mail-Adresse zu bestätigen, fand ich dieses Muster:JS, RegExp, seltsame Verhalten

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

Als ich das Muster auf regex101 überprüfen Sie es wie erwartet verhält (was bedeutet, es nicht passt auf Beispiel [email protected]).

So ist die folgende Zeile ein:

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

Aber:

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

Was ?!, habe ich auf Chrom und Firefox getestet, das gleiche Verhalten, kann jemand erklären?

+1

'\ .' bedeutet etwas anderes in einem regulären Ausdruck wörtlichen, als es in einem String-Literal. –

+1

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

Antwort

0

\. ist keine gültige Escape-Sequenz in einem String-Literal, es löst einfach .. Das bedeutet, dass der reguläre Ausdruck, den Sie in dem zweiten Beispiel verwenden entspricht

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

Und . jedes Zeichen.

Sie können ganz einfach den Unterschied sehen, wenn Sie reguläre Ausdrücke an der Konsole anmelden:

enter image description here

+0

Ich habe keine Ahnung, wie ich nicht darüber dachte, danke, liebe die Erklärung :) –

0

Das Problem ist, dass \. als . in Ihrem regex ausgewertet wird. effektiv Mit anderen Worten, ist Ihr regex: ^[^@][email protected][^@]+.[^@]+$

Um dies zu beheben, verwenden Sie die // regex Trennzeichen:

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

oder' patt = new RegExp ('^ [^ @] + @ [^ @] + \\. [^ @ ] + $ ') ' –