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

时间:2019-04-24 04:23:40

标签: php regex pcre

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

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

我正在尝试使用正则表达式(这是一项要求)来返回带有小数点后三位的12.345的第一个值和带有小数点后的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

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

1 个答案:

答案 0 :(得分: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