匹配模式的正则表达式,或者是一个空字符串
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 文档。
【讨论】:
以上是关于匹配模式的正则表达式,或者是一个空字符串的主要内容,如果未能解决你的问题,请参考以下文章