正则表达式为逗号分隔列表的子串

问题描述 投票:4回答:1

我是正则表达式的初学者,所以如果这是一个天真的问题,我会提前道歉!

我有一个字符串,其中两个值用逗号分隔:12.345678,23.45678901

我试图使用正则表达式(这是一个要求)返回第一个值为3位小数12.345和第二个值为2位小数23.45

理想情况下,完整的正则表达式匹配将是12.345,23.45

我可以使用以下正则表达式获得第一个值12.345:^\d+\.\d{0,3}

这很有效,因为它只返回完整匹配(没有组1匹配)。但我很沮丧如何在同一个字符串中返回第二个值23.45。

我也尝试了这个正则表达式:(^.{0,6})(?:.*)(,)(.{0,5}),它正确地解析了第一个和第二个值,但是返回的完整匹配的小数位数太多了。

完全匹配:12.345678,23.45

第1组:12.345

第2组:,

第3组:23.45

欢迎任何建议!先感谢您。

php regex pcre
1个回答
3
投票

您可以使用此正则表达式来获取数据:

^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$

它查找数字后跟.和3个小数位(第一个捕获组),然后是一些数字后跟一个逗号(丢弃),然后是数字后跟一个.和2个小数位(第二个捕获组),最后是一些数字位数和字​​符串结尾(丢弃)。

在PHP中使用

$str = '12.345678,23.45678901';
preg_match('/^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$/', $str, $matches);
echo "first number: {$matches[1]}\nsecond number: {$matches[2]}\n";

输出:

first number: 12.345 
second number: 23.45

Demo on 3v4l.org

如果你需要在$matches[0]数组中获得两个匹配项(使用preg_match_all),你可以使用这个正则表达式:

(?<=^)\d+\.\d{3}(?=\d*,)|(?<=,)\d+\.\d{2}(?=\d*$)

这个正则表达式寻找

  • 字符串的开头后跟一些数字,一个.和3位数字(后跟一些数字和一个逗号);要么
  • 一个逗号,一些数字,一个.和2位数(后跟一些数字和字符串的结尾)。

为了避免捕获不需要的数据,使用正向前瞻和后视来检查它。

Demo on 3v4l.org

© www.soinside.com 2019 - 2024. All rights reserved.