正向后行断言贪婪匹配

4

我认为我对正则表达式中的正向后行断言有些误解,这里有一个例子:

12,2 g this is fully random
89 g random string 2
0,6 oz random stuff
1 really random stuff

假设我想匹配度量单位后的所有内容,因此我想匹配“this is fully random”,“random string 2”,“random stuff”和“really random stuff”。
为了实现这一目标,我尝试了以下模式:
(?<=(\d(,\d)?) (g|oz)?).*

但是由于“?”表示0或1,所以在这种情况下,该模式似乎优先考虑0而不是1——因此我得到: 输入图像描述 但是测量单位必须保持为“可选项”,因为它可能不会出现在字符串中(参见第四个实例)...
你有处理这个问题的任何想法吗?谢谢!
1个回答

7
为了更好地了解匹配的情况,可以查看与其相匹配的位置。断言 (?<=(\d(,\d)?) (g|oz)?) 在一个位置上为真,这个位置直接在左侧是 (\d(,\d)?) 并且可选的是 (g|oz)?
模式从左到右进行匹配,并且断言在多个位置上为真。但是在遇到的第一个位置上,它会匹配 .*,意思是0+次任何字符并且将匹配到行尾。
请参见regex101 上的位置
相反,您可能会匹配数字部分,并使空格后跟goz变成可选项,并使用第二个部分的捕获组。
\d+(?:,\d+)?(?: g| oz)? (.*)

正则表达式演示


1
好答案!我直觉地知道为什么它以一种看似不贪婪的方式工作,但是我很难在评论或回答中写出解释,所以我放弃了:D - 41686d6564 stands w. Palestine
1
在我看来,(?: g|)? = (?: g|) = (?: g)? - Wiktor Stribiżew
1
哦,好的,现在更有意义了!我一定会采用那个解决方案,这正是我想要的,谢谢 :) - mnd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接