我会假设\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
答案 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)
出现在当前位置的右侧。