【问题标题】:matching numbers with regex with specific requirement将数字与具有特定要求的正则表达式匹配
【发布时间】:2020-12-18 11:10:53
【问题描述】:

我想将文本中以下粗体标记的数字与数字和文本相匹配。

一些文字 12.444 12,444 12'444 123.122 12.1234 12345 1234 12.12 12.1234567 12.242文本 12.242 Text Text12.242 Text12.242Text

带有点状分隔符的数字只能有 3 个后续数字。如果数字有更多位数,则应忽略它。数字应作为一个整体匹配。 12.34567 不应与 34567 匹配。

数字应该作为一个整体匹配,以便我以后可以将“从 12.12356.789”与 2 个组匹配 组 1:12.123 组2:56.786

我从以下不符合需求的正则表达式开始:

[?<!\d][0-9]{1,2}[,|\.][0-9]{3}[?!\d]

【问题讨论】:

  • 你能澄清一下规则吗?你想找到123.45612吗?

标签: regex


【解决方案1】:

你可以使用

(?<!\S)(?:[0-9]{1,2}[,.'][0-9]{3}|[0-9]{3,})(?!\S)

请参阅regex demo注意:如果 1-2 位数字中的小数部分是可选的,则用可选组将其包装起来,(?:[,.'][0-9]{3})?:

(?<!\S)(?:[0-9]{1,2}(?:[,.'][0-9]{3})?|[0-9]{3,})(?!\S)

详情:

  • (?&lt;!\S) - 左侧空白边界
  • (?: - 非捕获组的开始:
    • [0-9]{1,2} - 一位或两位数
    • [,.'] - 逗号、点或'
    • [0-9]{3} - 三位数
  • | - 或
    • [0-9]{3,} - 三位或更多位数
  • ) - 小组结束
  • (?!\S) - 右侧空白边界

【讨论】:

    【解决方案2】:

    除了应该是括号的方括号之外,在T这样的字符的情况下,断言左侧或右侧不是数字仍然是正确的

    要匹配您可以使用的所有粗体值:

    (?<!\S)[0-9]+(?:[,.'][0-9]{3})?(?!\S)
    
    • (?&lt;!\S) 在左侧断言非非空白字符
    • [0-9]+ 匹配 1 个或多个数字
    • (?:[,.'][0-9]{3})? 匹配可选的 3 位小数部分
    • (?!\S) 在右侧断言非非空白字符

    Regex demo

    该模式将匹配具有 3 位小数或 1 位或更多位的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多