Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Scala可选的非捕获组行为懒惰?_Regex_Scala - Fatal编程技术网

Regex Scala可选的非捕获组行为懒惰?

Regex Scala可选的非捕获组行为懒惰?,regex,scala,Regex,Scala,我不是在找一个正则表达式来匹配电话号码。这只是我的用例。我想知道为什么我的正则表达式没有在捕获中包含可选的非匹配组 为了更好地说明我的具体用例,我们做一点介绍。我正在试着匹配电话号码。我有一个工作正则表达式,但使用扩展时除外 我的正则表达式(有点长,但很全面): 一个简短的版本来说明我的问题: (\d{4}[-.()\/* ]*?(?:(?:x|ext)[:]?[ ]*\d+)?) 其中: (…)是我的捕获组 \d{4}四位数字 [-.()\/*]*?各种分隔符0-无限次(非贪婪) (?:…)

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

为了更好地说明我的具体用例,我们做一点介绍。我正在试着匹配电话号码。我有一个工作正则表达式,但使用扩展时除外

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

一个简短的版本来说明我的问题:

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

(…)
是我的捕获组

\d{4}
四位数字

[-.()\/*]*?
各种分隔符0-无限次(非贪婪)

(?:…)
非捕获组

x | ext
扩展标识符

[:]?
“:”0-1次

[]*
“0-无限次

\d+
数字1-无限次

(?:…)?
非捕获组0-1次

所以
1234 ext 567
应该匹配,但只有
1234
匹配

Regex101链接:

如果我删除了
,使该组不是可选的,它就可以正常工作:

(\d{4}[-.()\/* ]*?(?:(?:x|ext)[:]?[ ]*\d+))
(\d{4}[-.()\/* ]*(?:(?:x|ext)[:]?[ ]*\d+)?)
似乎是
使它变懒了,但也无法匹配没有扩展名的数字


如果您删除分隔符符号后的惰性
*?
量词,将非常感谢您提供的任何帮助或见解,那么它似乎可以正常工作:

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

foo[bar]*?(?:扩展名)
-regex在
foo
之后立即停止匹配的原因是
*?
量词强制它尽早停止,精确匹配
bar
中的零个字符,然后跳过未捕获的扩展名组

您也可以考虑将<代码> [-.](*/*] *一部分移到<代码>(……)/<代码>中,因为否则它将匹配没有遵循适当扩展的句号。


老实说,我不确定您在那里用
()
尝试了什么:它真的应该匹配
1234)ext5678

scala和惰性评估在哪里起作用?据我所知,这是一个严格的正则表达式问题。
*?
是一个懒惰的正则表达式。如果我理解正确,您只需要在
[…]
之后添加
*
,而不是
*?
。标记<代码>惰性评估不正确,与此无关。@emsimpson92我不认为这是重复的。当我试图匹配电话号码时,我的问题不是找到一个正则表达式来匹配电话号码。相反,为什么扩展不匹配组表现得很懒。远不止这些specific@AndreyTyukin你是对的,我的意思是lazy regex,它不是懒惰的扩展组。正是
[-.()\/*]*?
匹配零个字符,然后放弃,因为它“足够好”。巴拉那语主要用于区号和国家代码。对于缩短的示例,它们是无关的。我使用组件构建正则表达式,这是我的通用“分隔符”。正是因为这个原因,我才懒散,所以我可能需要少一些泛化