我是正则表达式的初学者,所以如果这是一个天真的问题,我会提前道歉!
我有一个字符串,其中两个值用逗号分隔: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
欢迎任何建议!先感谢您。
您可以使用此正则表达式来获取数据:
^(\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
如果你需要在$matches[0]
数组中获得两个匹配项(使用preg_match_all
),你可以使用这个正则表达式:
(?<=^)\d+\.\d{3}(?=\d*,)|(?<=,)\d+\.\d{2}(?=\d*$)
这个正则表达式寻找
.
和3位数字(后跟一些数字和一个逗号);要么.
和2位数(后跟一些数字和字符串的结尾)。为了避免捕获不需要的数据,使用正向前瞻和后视来检查它。