懒惰的Scala可选非捕获组行事吗?

时间:2018-07-03 19:33:40

标签: regex scala

我不是要寻找与电话号码匹配的正则表达式。这只是我的用例。我想知道为什么我的正则表达式在捕获中没有包含可选的不匹配组。

为了更好地阐明我的特定用例,需要进行一些介绍。我正在尝试匹配电话号码。除了使用扩展名时,我的正则表达式正常工作。

我的正则表达式(有点长,但是很全面):

((?:\+{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+))

似乎?使其变得懒惰,但随后也将不匹配没有扩展名的数字。

任何帮助或见解将不胜感激

1 个答案:

答案 0 :(得分:1)

如果您在分隔符后删除了懒惰的*?量词,那么它似乎可以正常工作:

(\d{4}[-.()\/* ]*(?:(?:x|ext)[:]?[ ]*\d+)?)

演示:regex101

您的foo[bar]*?(?:extension)?-正则表达式在foo之后立即停止匹配的原因是,*?量词迫使它尽早停止,与{{1}中的零个字符完全匹配},然后跳过非捕获扩展组。

您还可以考虑将bar部分也移到[-.()\/* ]*中,因为否则它将匹配没有适当扩展名的句点。

老实说,我不确定您在(?: ... )?那里尝试过什么:真的应该匹配()吗?