^((?=.*[1-9]|0)(?:\d{1,3}))((?=.*\d)(?:\.\d{3})?)*((?=.*\d)(?:\,\d\d){1}?){0,1}$
我实际上认为这个正则表达式很长,而且可能会更短。问题是我对正则表达式不是很好,所以我请求你帮忙。
在线正则表达式测试人员http://regexr.com/3a3mk
我的规则:
积极的结果
否定结果
[编辑]添加了更多的否定结果
答案 0 :(得分:8)
答案 1 :(得分:2)
编辑:
^(0|[1-9][0-9]{0,2}(\.[0-9]{3})*)(,[0-9]{2})?$
匹配:
^
行的开头
[1-9]
只有一个非零数字
[0-9]{0,2}
介于0和2位之间
(\.[0-9]{3})*
零个或多个句点和3个数字
(0 | [1-9][0-9]{0,2}(\.[0-9]{3})*)
要么(i)零或(ii)最多三位数(第一个不是零),接着是零个或更多个句点后跟三个数字的块
(,[0-9]{2})?
零个或一个逗号和2个数字
$
行尾
答案 2 :(得分:1)
你是对的,你的表达有点长。与您提供的示例数字和规范一起使用的较短版本将是:
^(0|\d{1,3})(\.\d{3})*(,\d{2})?$
<强>解释强>
(0|\d{1,3})
检查0或1到3位数(\.\d{3})*
检查一个点和3个数字,但由于*
也可能没有这些数字(,\d{2})?
以逗号和两位数字表示,但同样可以显示一次或根本不显示。希望它可以帮到你!