正则表达式匹配一个模式,或者是一个空字符串。

126

我有以下正则表达式可以匹配电子邮件地址的格式:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$

这是用于使用JavaScript对表单进行验证。然而,这是一个可选字段。因此我该如何更改这个正则表达式以匹配电子邮件地址格式或空字符串?

根据我有限的正则表达式知识,我认为\b匹配一个空字符串,|表示“或”,所以我尝试了下面的方法,但它没有起作用:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b

6
如果你必须验证电子邮件,请尽可能放宽限制。使用自己编写的正则表达式很容易忽略真实、有效和可用的电子邮件地址。例如,你的正则表达式将无法通过以下有效地址的验证:joe_blow@foo.com,micro$oft@apple.com,root@localhost,siegfried+roy@lasvegas.com - Zano
1
同意Zano的观点,只需查看此正则表达式http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html - Anders
@Anders 哇,那是一个非常复杂的正则表达式!我想我低估了正则表达式的复杂性。 - Curtis
5
不,我认为您低估了电子邮件验证的复杂性 :-) - Zano
5个回答

282

要匹配pattern或空字符串,请使用

^$|pattern

说明

  • ^$分别是字符串锚点的开头和结尾。
  • |用于表示可选项,例如 this|that

参考资料


关于 \b

在大多数情况下,\b 是一个 "单词边界" 锚点。它是一种零宽匹配,即一个空字符串,但仅仅匹配那些在单词边界上的字符串。

也就是说,\b 出现的位置有:

  • 在连续的 \w\W(顺序不限)之间:
    • 即在单词字符和非单词字符之间
  • ^\w 之间
    • 即在以 \w 开始的字符串的开头
  • \w$ 之间
    • 即在以 \w 结尾的字符串的结尾

参考资料


使用正则表达式匹配电子邮件地址

这并不是一个简单的问题,要根据规范进行匹配。

相关问题


15

另一种方法是将正则表达式放在非捕获括号中。然后使用 ? 限定符使该表达式变为可选项,这将寻找非捕获组的0个(即空字符串)或1个实例。

例如:

/(?: some regexp )?/

在你的情况下,正则表达式应该长成这样:

/^(?:[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+)?$/

不需要使用 | 或 "or" 运算符!

这里 是 JavaScript 正则表达式语法的 Mozilla 文档。


11

我不确定为什么您想要验证可选电子邮件地址,但我建议您使用

^$|^[^@\s]+@[^@\s]+$
意义
^$        empty string
|         or
^         beginning of string
[^@\s]+   any character but @ or whitespace
@         
[^@\s]+
$         end of string

无论如何,您都无法停止假电子邮件,而用这种方法,您也不会停止有效的地址。


如果地址字段未输入,则会将NULL值输入到数据库中,因此在发送通讯时可以处理此问题。我知道这不会阻止虚假地址,而且我认为使用正则表达式根本不可能实现,但至少可以最大限度地减少人为错误。 - Curtis
1
我也经常收到客户的这种请求。实际上,这只是为了防止客户犯傻瓜错误,比如在电子邮件字段中输入他们的电话号码。 - Kelly Robins
1
只是想检查一个空字符串。^$有效。 - Subhashi

1

\b 匹配单词边界。我认为你可以使用 ^$ 来表示空字符串。


0

^$ 在正则表达式中如果有多个模式时对我无效。

另一个解决方案:

/(pattern1)(pattern2)?/g

"pattern2"是可选的。如果为空,则不匹配。

?匹配(pattern2)零次或一次。

在这里测试(“m”用于多行示例目的):https://regex101.com/r/mezfvx/1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接