我的电话号码如下格式
415-555-1234
(416)555-3456
202 555 4567
4035555678
1 416 555 9292
我要用这个表达式匹配所有这些,
[\(|\d\s]?\d{3}[-|\)\s]?\d{3}[-|\s]?\d{4}
它匹配除最后一个之外的所有。无法匹配上一个电话号码的前导"1 "
。
我想知道为什么这个表达不起作用。为什么\d\s
无法匹配上一个电话号码的前导"1 "
?
答案 0 :(得分:1)
你滥用方括号。它们包含一个字符类,可以推断出列表中的任何项目都应该匹配。请改用:
^(?:\(|\d\s)?\d{3}[-\)\s]?\d{3}[-\s]?\d{4}
这是regex demo!
但是,上面只修复了你的正则表达式错误。要匹配测试用例的实际完整格式,您应该使用此正则表达式:
^(?:\d\s)?(?:\(\d{3}\)|\d{3})(\s|(-)?)?\d{3}(?(2)-|(?(1)\s|-?))\d{4}$
^
字符串开头。(?:\d\s)?
可选的数字 - 空白序列。(?:
群组\(\d{3}\)
括号内有三位数字。|
或 \d{3}
三位数。)
(\s|(-)?)?
捕获组:可选的空格或连字符。第二个捕获组试图捕获连字符。\d{3}
三位数。(?(2)
如果我们匹配连字符,那么:-
在此处匹配连字符。|
ELSE (?(1)
如果我们匹配空格,那么:\s
在这里匹配一个空格。|
ELSE -?
如果需要,可以匹配连字符。)
)
\d{4}
四位数。$
字符串结束。但是,上述内容与语法匹配,但不捕获数字。要捕获数字,您必须将上述正则表达式扩展为以下内容:
^(?:\d\s)?(?|\((\d{3})\)|(\d{3}))(?|-(\d{3})-|\s(\d{3})\s|(\d{3})-?)(\d{4})$
这是regex demo!请注意,捕获第1组,第2组和第3组会保留电话号码中的前三个,后三个和最后四个数字。
答案 1 :(得分:1)
因为[\(|\d\s]
没有按照您的想法行事。它是一个匹配(
,|
,0-9中任何数字或任何空白字符的字符类。你不需要这里的角色课。
我认为这是你正在寻找的东西:
(?:\d )?\(?\d{3} ?\)?-?\d{3} ?-?\d{4}