我有一个正则表达式,它将逗号分隔的数字与给定的多行文字中的可选两位小数部分相匹配。
/(?<=\s|^)\d{1,3}(,\d{3})*(\.\d{2})?(?=\s|$)/m
成功匹配1,12,12.34,12,345.67等字符串。如何修改它以匹配只有小数部分的数字,如.23
?
编辑:只是为了澄清 - 我想修改正则表达式,使其匹配12
,12.34
和.34
我正在寻找'独立'有效数字。即,数字字符串,其边界是空格或行/字符串的开头/结尾。
答案 0 :(得分:10)
此:
\d{1,3}(,\d{3})*(\.\d\d)?|\.\d\d
匹配以下所有数字:
1
12
.99
12.34
12,345.67
999,999,999,999,999.99
如果您想排除数字,例如123a
(例如街道地址)或123.123
(小数点后超过2位数字),请尝试:
(?<=\s|^)(\d{1,3}(,\d{3})*(\.\d\d)?|\.\d\d)(?=\s|$)
一个小小的演示(我猜你正在使用PHP):
$text = "666a 1 fd 12 dfsa .99 fds 12.34 dfs 12,345.67 er 666.666 er 999,999,999,999,999.99";
$number_regex = "/(?<=\s|^)(?:\d{1,3}(?:,\d{3})*(?:\.\d\d)?|\.\d\d)(?=\s|$)/";
if(preg_match_all($number_regex, $text, $matches)) {
print_r($matches);
}
将输出:
Array
(
[0] => Array
(
[0] => 1
[1] => 12
[2] => .99
[3] => 12.34
[4] => 12,345.67
[5] => 999,999,999,999,999.99
)
)
请注意,它会忽略字符串666a
和666.666
答案 1 :(得分:2)
/(?<=\s|^)(\d{1,3}(,\d{3})*(\.\d{2})?|\.(\d{2}))(?=\s|$)/m
或考虑到某些国家/地区。用作千位分隔符,用作小数分隔符
/(?<=\s|^)(\d{1,3}(,\d{3})*(\.\d{2})?|\d{1,3}(\.\d{3})*(,\d{2})?|\.(\d{2})|,(\d{2}))(?=\s|$)/m
国际化的疯狂正则表达
/((?<=\s)|(?<=^))(((\d{1,3})((,\d{3})|(\.\d{3}))*(((?<=(,\d{3}))(\.\d{2}))|((?<=(\.\d{3}))(,\d{2}))|((?<!((,\d{3})|(\.\d{3})))([\.,]\d{2}))))|([\.,]\d{2}))(?=\s|$)/m
匹配
14.23
14,23
114,114,114.23
114.114.114,23
不匹配
14.
114,114,114,23
114.114.144.23
,
.
<empty line>
答案 2 :(得分:0)
This answer更全面地对待这个问题。
答案 3 :(得分:-1)
(@&#34;?。^((([0-9] +)(([0-9] +)))(\,(([0-9] +)(([0 ?-9] +))))*)$&#34)
这适用于以逗号分隔的整数或逗号分隔的十进制数。
实施例: 快乐的场景: 案例1)9,10 案例2)10.1,11,12,15,15.2 案例3)9.8 案例4)9
悲伤的场景: 案例1)2..7 案例2)2,7 案例3)2。 案例4)7, 案例5), 案例6)。 案例7).2 案例8),2