匹配正则表达式中的所有数字,短语 foo2020 除外



在一个混乱的字符串中,例如: 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+)

正则表达式演示

最新更新