积极贪婪的向后看

问题描述

我想我对正则表达式在Regex中的工作方式有一些误解,下面是一个示例:

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

假设我要匹配度量单位之后的所有内容,因此我希望“这是完全随机的”,“随机字符串2”,“随机填充”和真正的“随机填充”。

为此,我尝试了以下模式:

(?<=(\d(,\d)?) (g|oz)?).*

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

enter image description here

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

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

解决方法

更容易查看与之匹配的位置以查看发生了什么。断言const makeGrid = lim => Array.from(Array(lim+1).keys()) // make 101 .slice(1) // drop the 0 .map(i => i%10===0?` ${i}\n`:` ${i}`) // map to have a newline .join(""); console.log(makeGrid(100));在直接位于(?<=(\d(,\d)?) (g|oz)?)和可选(\d(,\d)?)

左边的位置上为真

模式从左到右,并且断言在多个地方为真。但是在它遇到的第一个地方,它与(g|oz)?匹配,表示0+乘以任意字符,并且将匹配到行尾。

查看职位on regex101

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

oz

Regex demo