【问题标题】:Positive Lookbehind greedy积极的向后看贪婪
【发布时间】:2021-01-12 14:16:34
【问题描述】:

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

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 - 所以我得到:

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

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

【问题讨论】:

    标签: regex regex-lookarounds regex-greedy


    【解决方案1】:

    查看匹配的位置以了解发生了什么会更容易。断言(?&lt;=(\d(,\d)?) (g|oz)?) 在左侧为(\d(,\d)?) 和可选(g|oz)? 的位置为真

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

    查看职位on regex101

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

    \d+(?:,\d+)?(?: g| oz)? (.*)
    

    Regex demo

    【讨论】:

    • 很好的答案!我凭直觉知道它为什么会这样工作(以一种看似不贪婪的方式),但很难在评论或答案中写下解释,所以我放弃了:D
    • 在我看来(?: g|)? = (?: g|) = (?: g)?
    • 哦,好吧,现在更有意义了!我肯定会采用正是我正在寻找的解决方案,谢谢:)
    猜你喜欢
    • 2020-01-11
    • 2023-02-26
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多