正向后视贪婪

mnd*_*mnd 4 regex regex-greedy regex-lookarounds

我想我对正则表达式中的正向 Lookbehind 的工作方式有一些误解,这是一个例子:

12,2 g this is fully random
89 g random string 2
0,6 oz random stuff
1 really random stuff
Run Code Online (Sandbox Code Playgroud)

假设我想匹配测量单位之后的所有内容,所以我想要“这是完全随机的”、“随机字符串 2”、“随机内容”和真正的“随机内容”。

为了做到这一点,我尝试了以下模式:

(?<=(\d(,\d)?) (g|oz)?).*
Run Code Online (Sandbox Code Playgroud)

但是作为“?” 表示 0 或 1,在这种情况下,模式似乎将 0 优先于 1 - 所以我得到: 在此处输入图片说明

但是测量单位必须保持“可选”,因为它不需要在字符串中(参见第四个实例)......

关于如何处理这个问题的任何想法?谢谢!

The*_*ird 7

查看它匹配的位置以查看会发生什么会更容易。断言(?<=(\d(,\d)?) (g|oz)?)在直接左侧是(\d(,\d)?) 可选的位置为真(g|oz)?

该模式从左到右,断言在多个地方为真。但是在它遇到的第一个地方,它匹配.*意味着任何字符的 0+ 倍,并将匹配到行尾。

查看regex101 上的位置

您可能会做的是匹配数字部分并使空格后跟goz可选,并为第二部分使用捕获组。

\d+(?:,\d+)?(?: g| oz)? (.*)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示