我是regex的初学者,如果这是个幼稚的问题,我会提前道歉!
我有一个字符串,两个值用逗号分隔:12.345678,23.45678901
我试图使用regex(这是一个要求)返回第一个值(3个小数12.345)和第二个值(2个小数23.45)。
理想情况下,完整的regex匹配将12.345,23.45
我可以使用以下正则表达式获得第一个值12.345:^\d+\.\d{0,3}
这很好,因为它只返回完全匹配(没有组1匹配)。但是我很难理解如何在同一个字符串中返回第二个值23.45。
我也试过这个正则表达式:
(^.{0,6})(?:.*)(,)(.{0,5}),它正确地解析第一个和第二个值,但返回的完全匹配的小数太多。
完全匹配:12.345678,23.45
第一组:12.345
第2组:,
第3组:23.45
欢迎提出任何建议!提前谢谢你。

最佳答案

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

^(\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*$)

这个正则表达式查找
字符串的开头,后跟一些数字、a.和3位数(后跟一些数字和逗号);或
逗号、一些数字、a.和两个数字(后跟一些数字和字符串结尾)。
为了避免捕获不需要的数据,将检查它是否使用正lookaheads和lookbehinds。
Demo on 3v4l.org

09-11 19:03
查看更多