在一个混乱的字符串中,例如: dfnjvqifoo2020o43e25w54p32n5qvto4325432543nvgn4325gn2020repw
我想匹配字符串中的所有数字,除了短语 foo2020
我试过/(?<!foo(\d+/g 问题是 foo20 中的 020 在不应该匹配的时候被匹配,我知道这是因为 \d 意味着匹配一位数,但我不知道如何解决这个问题
您的正则表达式/(?<!foo)d+/g
匹配任何一个或多个前面不带foo
的数字。这意味着,如果最左边的数字前面没有紧跟foo
,它将与此正则表达式匹配。
您需要做的就是添加另一个限制:如果左侧有一个数字,则不要开始匹配数字,即添加(?<!d)
,一个左侧的数字边界构造。
/(?<!foo)(?<!d)d+/g
// ^^^^^^^
请参阅正则表达式演示。
请注意,两个连续的回溯,(?<!foo)(?<!d)
是在同一位置一个接一个地执行的,这意味着如果当前位置左侧有foo
或数字,则不会匹配。
如果需要确保右侧没有数字,请在d+
模式后附加(?!d)
,即右侧数字边界构造。这里不需要,但是如果您需要在abc50def
而不是abc500def
中匹配50
,则需要这种负面的展望。
如果您只想要匹配项,则可以将d*
添加到回溯中。请注意,并非所有浏览器都广泛支持此功能。我将在例如chrome或nodejs中工作。
(?<!food*)d+
解释
(?<!food*)
否定回头,断言左边的内容不是foo
后跟 0+ 数字d+
匹配 1+ 位数字
正则表达式演示
另一种选择是使用捕获组,匹配您不想要的内容并捕获您想要的内容。
food+|(d+)
正则表达式演示