正则表达式的.NET实现定义了'?'字符作为贪婪量词,通知其表达式匹配0或1次,如果可能则更喜欢1。
考虑以下源文本:
some text (some parenthetical text)
以下正则表达式:
\A(.+)(?:\s\(.+\))?$
结果应该是一个匹配的组,其值为:
some text
相反,它是整条线。现在当我从正则表达式中删除贪婪的0或1量词'?'时,我确实得到了预期的结果。但是,由于我的要求可能不存在括号内的文本,因此我不能将0或1个量词关闭。我如何强迫它贪婪?
答案 0 :(得分:3)
这与你认为的方式不匹配的原因是因为(.+)
贪婪。
让我解释一下:
(.+)
贪婪,所以它会立即匹配整个字符串。
(?:\s\(.+\))?
也贪婪然而只是因为某些东西贪婪它并不代表它有匹配如果它也没有。
举个例子:
字符串:abc123
正则表达式:(.+)(\d{3})?
.+
将开始匹配abc123
。正则表达式引擎将转到下一个字符(这是一个空字符)并查看此(\d{3})?
。现在,如果可能的话,正则表达式引擎更愿意匹配\d{3}
,但它已匹配整个字符串。由于\d{3}
技术上是可选的,因此可以将其丢弃。
你最好的选择是让第一部分变得懒惰并保持最后一节贪婪。
\A(.+)(?:\s\(.+\))?$
将成为\A(.+?)(?:\s\(.+\))?$
(.+?)
将尝试匹配尽可能少的字符,以便为下半部分留出空间,但如果不需要下半部分,它将消耗其余字符串。
此处有regex101个示例(我将\A
更改为^
,因此多行可行)