货币编号的正则表达式,我怎样才能写得更短?

时间:2014-12-18 08:13:55

标签: regex

^((?=.*[1-9]|0)(?:\d{1,3}))((?=.*\d)(?:\.\d{3})?)*((?=.*\d)(?:\,\d\d){1}?){0,1}$

我实际上认为这个正则表达式很长,而且可能会更短。问题是我对正则表达式不是很好,所以我请求你帮忙。

在线正则表达式测试人员http://regexr.com/3a3mk

我的规则:

  • 从1,2或3个正数[1-9]或0开始。
  • 添加尽可能多的。 (根据需要后跟3个数字[0-9])。
  • 添加带2个数字(小数点)的逗号的可能性

积极的结果

  • 0
  • 0,55
  • 1
  • 1,60
  • 10
  • 10,70
  • 100
  • 100,80
  • 1,10
  • 1.000
  • 1.000,20
  • 10.000
  • 10.000,03
  • 100.000
  • 100.000,08
  • 1.000.000.000
  • 1.000.000.000,10

否定结果

  • 0,0
  • 1,1
  • 1000
  • 1000.000
  • 0.000
  • 0.000,10
  • 1.000,1
  • 1.000,100
  • 1.0,00
  • 1.00,00
  • 1.000,0
  • 01
  • 012,10
  • 012.123,10
  • A0
  • 0,一
  • 0,AA
  • 1.a00.00
  • 1.000.a1

[编辑]添加了更多的否定结果

3 个答案:

答案 0 :(得分:8)

以下内容应符合您的需求:

^(?:0|[1-9]\d{0,2})(?:\.\d{3})*(?:,\d{2})?$

Regular expression visualization

Debuggex

的可视化

regex101上的演示

答案 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})?以逗号和两位数字表示,但同样可以显示一次或根本不显示。

希望它可以帮到你!