【问题标题】:Match all numbers in regex except for phrase foo2020匹配正则表达式中的所有数字,除了短语 foo2020
【发布时间】:2020-10-17 18:19:21
【问题描述】:

在混乱的字符串中,例如: dfnjvqifoo2020o43e25w54p32n5qvto4325432543nvgn4325gn2020repw

我想匹配字符串中除了短语 foo2020 之外的所有数字

我试过 /(?

【问题讨论】:

  • 您可以使用与捕获组 foo\d+|(\d+) regex101.com/r/oKC0SP/1 的交替使用您要查找的数字在组 1 中。
  • 另外澄清一下,2020 不应该匹配,因为它后面跟着 'foo'
  • 你可以匹配你不想要的(即foo2020),然后在一个组中捕获你想要的。 foo\d+|(\d+)
  • 另一个选项是使用(?<!foo\d*)\d+ regex101.com/r/nYkR4S/1
  • 天哪,非常感谢,这让我头疼了好几个小时

标签: javascript regex string typescript numbers


【解决方案1】:

如果您只想要匹配,您可以将\d* 添加到后视。请注意,并非所有浏览器都广泛支持此功能。我将在例如 chrome 或 nodejs 中工作。

(?<!foo\d*)\d+

解释

  • (?&lt;!foo\d*) 负向后看,断言左边不是foo 后跟 0+ 位
  • \d+ 匹配 1+ 个数字

Regex demo


另一种选择是使用捕获组,匹配您不想要的并捕获您想要的。

foo\d+|(\d+)

Regex demo

【讨论】:

  • 17 个浏览器中有 7 个 listed here 不支持后视。因此,大约 59% 的浏览器已经支持后向查找(FireFox will support lookbehind 3 天内,因此算在内)
【解决方案2】:

您的正则表达式/(?&lt;!foo)\d+/g 匹配任何一个或多个不立即foo 开头的数字。这意味着,如果 最左边 数字不是立即foo 开头,它将与此正则表达式匹配。

您需要做的只是添加另一个限制:如果紧靠左边的数字,则不要开始匹配数字,即添加(?&lt;!\d)左侧数字边界构造

/(?<!foo)(?<!\d)\d+/g
//       ^^^^^^^

请参阅regex demo

注意两个连续的lookbehinds,(?&lt;!foo)(?&lt;!\d)一个接一个地在同一个位置执行,也就是说如果有foo就没有匹配到当前位置左侧的一个数字。

如果您需要确保右边没有数字,请在\d+ 模式之后附加(?!\d),一个右手数字边界构造 .此处不需要,但如果您需要在 abc50def 中匹配 50 而不是在 abc500def 中,则需要此否定前瞻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多