使用正则表达式匹配字符串中的第4个数字

时间:2019-07-09 11:31:59

标签: regex

我需要使用正则表达式将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

2 个答案:

答案 0 :(得分:2)

您可以使用

^(?:[\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](当从零开始计数时)。

答案 1 :(得分:0)

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

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

让我们把它分开:

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

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

  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})