【问题标题】:Match the 4th number in a string using a regular expression使用正则表达式匹配字符串中的第 4 个数字
【发布时间】:2019-07-09 19:59:11
【问题描述】:

我需要使用正则表达式匹配 6 个数字的字符串中的第 4 个数字。

  1. 这些数字使用逗号 (,) 作为千位分隔符,使用句点 (.) 作为小数分隔符。
  2. 数字将始终包含句号,但不总是包含逗号。
  3. 每个数字用空格隔开

示例:以空格分隔的数字字符串:

35,362.843 1,261.94 0.000 35,362.843 1,257.43 44,466,154.16

我的正则表达式使用向前看和向后看

(?<= )(\d*,*\d*\.\d*)(?= \d*,*\d*\.)

实际结果

1,261.94 0.000 35,362.843

预期结果

35,362.843

【问题讨论】:

  • 请准确说明您正在使用的工具和正则表达式风格。
  • 出于好奇——你为什么需要一个正则表达式?
  • 在你的例子中,你得到了第三个数字,你想要第三个还是第四个?解决方案应该是在空间上拆分,然后获取数组的第 3 个(第 4 个)元素。

标签: regex


【解决方案1】:

你可以使用

^(?:[\d,.]+\s){3}([\d.,]+)

并使用第一个捕获组,请参阅a demo on regex101.com


表达式读作
^                 # start of string / line
(?:[\d,.]+\s){3}  # non-capturing group with a character class [0-9,.] 
                  # followed by a whitespace, thrice
([\d.,]+)         # the part in question -> group 1


但更好的是:以编程方式分割空格并使用生成的array[3](从零开始计数时)。

【讨论】:

    【解决方案2】:

    名为“fourth”的捕获组(捕获组 1)将为您提供预期的结果:

    (?<number>\d{1,3}(?:,\d{3})*\.\d*){0}(?:(?&number) ){3}(?<fourth>(?&number))(?=(?: (?&number)){2})
    

    让我们分开:

    (?<number>\d{1,3}(?:,\d{3})*\.\d*){0}
    

    定义名称“数字”,其中数字定义为

    1. 至少有 1 位,最多 3 位数字
    2. 可选地后跟无限量的逗号和三位数
    3. 一个必要的时期
    4. 无限数量的数字(或没有)

    (?:(?&number) ){3}
    

    匹配三个后跟一个空格的数字。不支持 Lookbehinds,因为数字没有固定长度。


    (?<fourth>(?&number))
    

    匹配单个数字,不包括空格。


    (?=(?: (?&number)){2})
    

    断言还有两个空格分隔的数字。


    作为简单的正则表达式

    如果您的正则表达式引擎不允许命名捕获组,那么这个简单的正则表达式将执行相同的工作:

     (?:\d{1,3}(?:,\d{3})*\.\d* ){3}(\d{1,3}(?:,\d{3})*\.\d*)(?=(?: \d{1,3}(?:,\d{3})*\.\d*){2})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多