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