我需要使用正则表达式将6个数字的字符串中的第4个数字匹配。
示例:用空格分隔的数字字符串:
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
答案 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}
定义名称“数字”,其中数字定义为
(?:(?&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})