正则表达式匹配最后一次出现之前

时间:2019-09-24 12:58:22

标签: regex regex-lookarounds

我会假设\d{3}(?=.*(?!\d{3})string)仅在这里匹配 333 000 111 222 333 string 444 555 666-但事实并非如此。 有人知道为什么吗?


我还希望在这种情况下,000 111 222 333 sdfasdjf;sdfjn 999 skljdfn\;sdlfn\sd string 444 555 666中只有999个匹配。..只是为了澄清。

我尝试在许多星座中嵌套积极和消极的前瞻和回溯,并做到这一点,变得有些好奇和绝望。.不再确定正则表达式可以做到这一点..因此,请提出任何建议(否则使用其他工具)-lmk

1 个答案:

答案 0 :(得分:1)

\d{3}(?=.*(?!\d{3})string)模式与任意3位数字匹配,后跟尽可能多的0+字符,然后匹配一个不以3位数字开头的string文本-始终为真,{{ 1}}的开头不是3位数字。

您可以使用

string

或者,如果必须将3位数字的块作为整个单词进行匹配:

\d{3}(?!.*\d{3}.*string)(?=.*string)

或者-如果这3位数字必须始终用空格括起来

\b\d{3}\b(?!.*\b\d{3}\b.*string)(?=.*string)

请参见regex demo

在这里,匹配三位数后,

  • (?<!\S)\d{3}(?!\S)(?!.*(?<!\S)\d{3}(?!\S).*string)(?=.*string) -前瞻否定确保没有3位数字,然后(?!.*\d{3}.*string)位于当前位置的右侧
  • string-一个积极的前瞻,要求(?=.*string)出现在当前位置的右侧。