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

Posted

技术标签:

【中文标题】匹配模式的正则表达式,或者是一个空字符串【英文标题】:Regular expression which matches a pattern, or is an empty string 【发布时间】:2011-03-20 23:50:59 【问题描述】:

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

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

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

根据我有限的正则表达式知识,我认为\b 匹配一个空字符串,而| 表示“或”,所以我尝试执行以下操作,但没有成功:

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

【问题讨论】:

如果您必须验证电子邮件,请尽可能宽容。您会惊讶地发现,使用自制的正则表达式很容易错过真实、有效和实用的电子邮件地址。例如,您的正则表达式将在以下有效地址上失败:joe_blow@foo.com、micro$oft@apple.com、root@localhost、siegfried+roy@lasvegas.com。 同意Zano,看看这个正则表达式ex-parrot.com/pdw/Mail-RFC822-Address.html @Anders 哇,这是一个非常复杂的正则表达式!我想我误解了正则表达式的复杂性 不,我认为您误解了电子邮件验证的复杂性 :-) 【参考方案1】:

\b 匹配单词边界。我认为您可以将 ^$ 用于空字符串。

【讨论】:

【参考方案2】:

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

^$|pattern

说明

^$ 分别是字符串锚点的开头和结尾。 | 用于表示替代品,例如this|that

参考文献

regular-expressions.info/Anchors 和 Alternation

开启\b

\b 在大多数情况下是“单词边界”锚。这是一个零宽度匹配,即一个空字符串,但它只匹配非常特定位置的那些字符串,即单词的边界。

\b位于:

在连续的\w\W 之间(任意顺序): 即在单词字符和非单词字符之间 在^\w 之间 即如果它以 \w 开头,则在字符串的开头 \w$ 之间 即如果它以 \w 结尾,则在字符串的末尾

参考文献

regular-expressions.info/Word Boundaries

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

这取决于规范。

相关问题

What is the best regular expression for validating email addresses? Regexp recognition of email address hard? How far should one take e-mail address validation?

【讨论】:

【参考方案3】:

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

^$|^[^@\s]+@[^@\s]+$

意义

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

无论如何,您都不会阻止虚假电子邮件,这样您就不会阻止有效地址。

【讨论】:

如果没有在字段中输入地址,则会在数据库中输入 NULL 值,因此在发送时事通讯等时可以处理。我很感激这不会停止假地址,我认为 Regex 根本不可能,但它至少可以最大限度地减少人为错误 我也有客户经常要求这个。这实际上只是为了防止客户做一些愚蠢的事情,比如在电子邮件字段中输入他们的电话号码。 只是想检查一个空字符串。 ^$ 工作【参考方案4】:

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

例如:

/(?: some regexp )?/

在你的情况下,正则表达式看起来像这样:

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

不需要|“或”运算符!

Here 是关于 JavaScript 正则表达式语法的 Mozilla 文档。

【讨论】:

以上是关于匹配模式的正则表达式,或者是一个空字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

Java正则表达式基础学习

Java正则表达式基础学习

正则表达式

正则表达式

正则表达式的使用