我想使用以下正则表达式来验证电子邮件地址:
^[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#匹配的那些。
如果有人能指出我出错的地方,我会很感激!
答案 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