我不是要寻找与电话号码匹配的正则表达式。这只是我的用例。我想知道为什么我的正则表达式在捕获中没有包含可选的不匹配组。
为了更好地阐明我的特定用例,需要进行一些介绍。我正在尝试匹配电话号码。除了使用扩展名时,我的正则表达式正常工作。
我的正则表达式(有点长,但是很全面):
((?:\+{0,2}\d{1,3})?[-.()\/* ]*?\d{3}[-.()\/* ]*?\d{3}[-.()\/* ]*?\d{4}[-.()\/* ]*?(?:(?:x|ext)[:]?[ ]*\d+)?)
一个简短的版本来说明我的问题:
(\d{4}[-.()\/* ]*?(?:(?:x|ext)[:]?[ ]*\d+)?)
位置:
(...)
是我的捕获组
\d{4}
四位数
[-.()\/* ]*?
各种分隔符0-无限次(非贪婪)
(?:...)
非捕获组
x|ext
扩展名标识符
[:]?
“:” 0-1次
[ ]*
“” 0无限次
\d+
数字1次无限次
(?:...)?
非捕获组0-1时间
因此1234 ext 567
应该匹配,但只有1234
匹配
Regex101链接:regex101.com/r/NRQhTl/1
如果我删除了?
,则要使该组不是可选的,就可以了:
(\d{4}[-.()\/* ]*?(?:(?:x|ext)[:]?[ ]*\d+))
似乎?
使其变得懒惰,但随后也将不匹配没有扩展名的数字。
任何帮助或见解将不胜感激
答案 0 :(得分:1)
如果您在分隔符后删除了懒惰的*?
量词,那么它似乎可以正常工作:
(\d{4}[-.()\/* ]*(?:(?:x|ext)[:]?[ ]*\d+)?)
演示:regex101。
您的foo[bar]*?(?:extension)?
-正则表达式在foo
之后立即停止匹配的原因是,*?
量词迫使它尽早停止,与{{1}中的零个字符完全匹配},然后跳过非捕获扩展组。
您还可以考虑将bar
部分也移到[-.()\/* ]*
中,因为否则它将匹配没有适当扩展名的句点。
老实说,我不确定您在(?: ... )?
那里尝试过什么:真的应该匹配()
吗?