显然,此代码试图通过匹配电话号码中的任何字母字符来验证电话号码 - 如果匹配,则电话号码无效。
所以你想要任何字母字符(可选地嵌入在非空白字符中,尽管这些被列为可选,所以它们实际上是不相关的)除了序列x
(空格 x 空格)来匹配和触发失败。
这听起来像您想接受人们将分机嵌入电话号码的情况,如: 123-123-1234 x 789
.*([a-zA-Z])+(?<! x).*
非常接近。
编辑:这使用负面的后视结构。 (?<!
仅当从当前匹配位置开始,前面的字符与括号其余部分内的内容不匹配时,才允许正则表达式继续运行。因此,如果有领先优势x
,它将导致比赛失败。
--
使用此正则表达式,以下内容不匹配:
- 123-123-1234
- 123-123-1234 x789
- 123-123-1234 x 789
但它确实匹配:
- 123-123a-1234
- 123-123 asdfasdf 12312
- 123-123x-123123
- 123-123 xfasdf
由于if 语句中的 ,匹配的那些是无效的。!
但是话虽如此,如果您将电话号码验证编写为积极验证(即您允许什么),而不是消极无效(您具体避免什么),您的代码会容易得多。通过编写您允许的内容,您将能够更轻松地防止边缘情况。
例如,两个正则表达式都不匹配以下内容:
- 123-###-1234
- 123-!$#&^(##^#*@#(!@&#(#-1234
这将从您的函数返回 true。那是你真正想要的吗?
我强烈建议积极验证,而不是消极无效。
编辑:@Aprillion 建议之前的链接问题: 电话号码验证的综合正则表达式
这显示了电话号码验证的复杂程度(特别是如果您要验证的国家/地区超过 1 个)。那里有很多很好的建议,尽管它不是万能的总结。我倾向于在前端只允许数字(带有可选的免费评论字段)用于电话号码输入。
我还必须承认,这确实让我对积极验证的信心降低了一点——尤其是如果你必须与一个任意的国际 # 打交道。
很多将取决于OP的实际要求。