首页 > 解决方案 > 正则表达式匹配最后一次出现之前

问题描述

我想在这里 \d{3}(?=.*(?!\d{3})string)只匹配333000 111 222 333 string 444 555 666 - 但它没有。有人知道为什么吗?


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

我尝试在许多星座中嵌套正面和负面的前瞻和后视并实现这一目标,并变得有点好奇和有点绝望..不再确定正则表达式可以做到这一点..所以如果您有任何建议(除非使用不同的工具)-lmk

标签: regexregex-lookarounds

解决方案


\d{3}(?=.*(?!\d{3})string)模式尽可能多地匹配后跟任何 0+ 字符的任何 3 位数字,然后匹配string不以 3 位数字开头的文本 - 这始终是正确的,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)

查看正则表达式演示

在这里,匹配三个数字后,

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

推荐阅读