使用JavaScript验证电子邮件地址时的结果不正确

时间:2017-03-02 11:25:19

标签: javascript regex validation

我想使用以下正则表达式来验证电子邮件地址:

^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.]+@[a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$

它旨在提供用户输入并且相当宽容,因为它会允许一些不合法的边缘情况,但会捕获大多数错误。

我已经在C#应用程序中使用了很长时间而没有问题。下面是一个简单的C#脚本,它显示它非常愉快地工作:

string pattern = @"^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.]+@[a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$";

string[] data = new string[] {
    "foo@bar.com",
    "foo@bar.co.uk",
    "foo-foo@bar.com",
    "foo.foo@bar.co.uk",
    "foo_foo_69@bar_123.museum",
    "o'foo@bar.com",
    "foofoo@barbar",
    "Foo@foo@bar.com",
    "@bar.com",
    "foo.com",
    "foo@bar",
    "foo@bar.co."
};

foreach (string email in data)
{
    bool valid = Regex.IsMatch(email, pattern);
    string state = valid ? "pass" : "fail";
    Console.WriteLine($"{state}: {email}");
}

这个小脚本提供了以下输出,正如我所期望的那样:

pass: foo@bar.com
pass: foo@bar.co.uk
pass: foo-foo@bar.com
pass: foo.foo@bar.co.uk
pass: foo_foo_69@bar_123.museum
pass: o'foo@bar.com
fail: foofoo@barbar
fail: Foo@foo@bar.com
fail: @bar.com
fail: foo.com
fail: foo@bar
fail: foo@bar.co.

我现在需要在JavaScript中验证客户端的电子邮件地址。当我在JS中尝试相同的事情时,我得到的结果略有不同!这是我上面程序的JS版本:

var pattern = "^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.]+@[a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$";

var data = [
    /* the same list of emails as above */
];


for (var i = 0; i < data.length; i++) {
    var valid = new RegExp(pattern).test(data[i]);
    var state = valid ? "pass" : "fail";
    console.log(state + ": " + data[i]);
}

这次我得到以下输出:

pass: foo@bar.com
pass: foo@bar.co.uk
pass: foo-foo@bar.com
pass: foo.foo@bar.co.uk
pass: foo_foo_69@bar_123.museum
pass: o'foo@bar.com
pass: foofoo@barbar             <- this should fail
pass: Foo@foo@bar.com           <- and this!
fail: @bar.com
fail: foo.com
fail: foo@bar
fail: foo@bar.co.

请注意中间的两个C#版本失败!!!只是为了确认我的正则表达式模式是否正常我使用了regex101.com优秀的单元测试功能来检查它,点击here查看我的测试/结果。请注意,我故意将其设置错误(所有测试&#39;预期&#39;匹配),因此它会突出显示无效的电子邮件地址。这里的任何方式都是结果的图片,你可以看到我使用C#匹配的那些。

test results

如果有人能指出我出错的地方,我会很感激!

1 个答案:

答案 0 :(得分:1)

C#&#39; s @(逐字)字符串文字按字面意思处理反斜杠,但JavaScript字符串不反复,反斜杠仍然是字符串级别的转义字符。如果希望正则表达式级别使用字符串来查看单个反斜杠,则需要为每个反斜杠使用两个反斜杠。

但不需要,JavaScript有正则表达式文字

var pattern = /^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.]+@[a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$/;

然后:

var valid = pattern.test(data[i]);
//          ^------ Note no `new RegExp(...)` here