对以下多行文字进行成像:
foo1
some text
foo12
some text
bar
some text
foo123
some text
我想知道哪些 foo 属于 bar 。换句话说,我需要在最后一个 foo 之后立即匹配数字,后面还有 bar 。
在上面的示例中,最后一个 foo 符合条件 foo12 ,所以我想匹配 12 。
我几乎没有关于正则表达式的线索,到目前为止,我得到了类似的结果:
(?s)(?<=foo)\d*(?=.*bar)
你可以在这里查看:
https://regex101.com/r/FiwO14/1
匹配前两个 foo ( foo1 和 foo12 )之后的数字,但我只需要第二个。< / p>
答案 0 :(得分:2)
您需要在前瞻中使用(?:(?!foo).)*?
tempered greedy token:
(?s)(?<=foo)\d*(?=(?:(?!foo).)*?bar)
^^^^^^^^^^^^^^
请参阅regex demo
(?:(?!foo).)*?
模式匹配任何char(.
),0次或更多次但尽可能少(*?
),这不是{{1}的起始字符}序列。
如果 foo
始终位于一行的开头,您也可以按如下方式编写:
foo
请参阅another regex demo(注意此处没有(?<=foo)\d*(?=.*(?:\R(?!foo\d).*)*bar)
DOTALL修饰符,此处不需要)。 (?s)
匹配:
.*(?:\R(?!foo\d).*)*
- 其余部分.*
- 零个或多个连续序列:
(?:\R(?!foo\d).*)*
- 任何没有跟\R(?!foo\d)
和任何数字\R
)
foo
- 其余部分。