我是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