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

Regex match last occurance before

我希望 \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

\d{3}(?=.*(?!\d{3})string) 模式匹配任何 3 位数字,后跟任何 0+ 个字符,然后是不以 3 位数字开头的 string 文本 - 这总是正确的, string 不是以 3 位数字开头。

您可以使用

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

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

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

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

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

regex demo

这里,匹配三个数字后,

  • (?!.*\d{3}.*string) - 否定前瞻确保没有 3 位数字,然后 string 当前位置右侧的某处
  • (?=.*string) - 要求 string 出现在当前位置右侧的任何位置的正前瞻。