【问题标题】:Match numbers not following words or punctuation匹配不跟随单词或标点符号的数字
【发布时间】:2019-04-21 15:43:27
【问题描述】:

我想要一个正则表达式来匹配前面没有空格或标点符号的数字,例如:

  • foo12 -> 匹配 12
  • foo 42 -> 不匹配
  • foo.42 -> 不匹配

我想出了: (?<![[:space:][:punct:]])\d+

但是,这并没有按我的意愿工作,至于示例,结果如下:

  • foo12 -> 匹配 12 (OK)
  • foo 42 -> 匹配 2(不正确)
  • foo.42 -> 匹配 2(不正常)

我明白,为什么它在最后两个示例中匹配单个数字(因为负向后视仅包括空格和标点符号),但是我不知道如何更改我的正则表达式以排除这些匹配项。如何纠正?

【问题讨论】:

  • \d 添加到字符类:(?<![[:space:][:punct:]\d])\d+
  • @revo 我确定我试过了!您可以添加您的评论作为答案,以便我接受吗?
  • 您似乎只想匹配字符串开头或字母之后的数字。然后您可以使用(?<![^[:alpha:]])\d+ / (?<!\P{L})\d+。见this regex demo。你在哪里使用正则表达式?

标签: regex regex-lookarounds


【解决方案1】:

部分匹配的原因是引擎并不确切知道应该从哪里开始考虑您的要求。您可以通过在字符类中包含 \d 来告诉引擎:

(?<![[:space:][:punct:]\d])\d+
                       ^^

【讨论】:

    【解决方案2】:

    This RegEx 可能会帮助您将字符串输入分成两组,其中第二组 ($2) 是目标数字,第一组 ($1) 是其后面的非数字:

    ([A-Za-z_+-]+)([0-9]+)
    

    如果您想将其用于文本处理,这样做可能是安全的。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多