正则表达式用逗号表示十进制数

时间:2013-11-22 20:59:41

标签: regex decimal comma

我很难找到包含逗号分隔符的十进制数的正确正则表达式。

我确实在一般情况下找到了一些关于这个问题的其他问题,但是当我测试它们时,没有一个答案真的有效

到目前为止我得到的最好的是:

[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)?

到目前为止的两个主要问题:

1)它记录的数字之间有空格“3001 1”而不是将它们分成2个匹配“3001”“1” - 我真的没有看到我在正则表达式中允许空格的位置。

2)我对正则表达式的开头\结尾有一个普遍的问题。

正则表达式应匹配:

3,001
1
32,012,111.2131 

但不是:

32,012,11.2131
1132,012,111.2131
32,0112,111.2131
32131

另外我想要匹配:

1.(without any number after it)
1,(without any number after it)
as 1

(应该忽略数字末尾的逗号或点)。

非常感谢!

3 个答案:

答案 0 :(得分:3)

这是一个非常长而且复杂的正则表达式,可以满足您的所有要求。如果您的正则表达式引擎基于PCRE(希望您使用的是PHP,Delphi或R ..),它将起作用。

(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$))

DEMO on RegExr

使事情变得如此之久的事情:

  1. 在同一行上匹配多个数字,仅由1个字符(空格)分隔,同时不允许部分匹配,需要前瞻和后视。
  2. 匹配以.,结尾的数字而不包括匹配中的.,需要另一个预测。
  3. (?=[,.](\s|$)) 解释

    在撰写此说明时,我意识到\s需要(\s|$)来匹配字符串最后的1,

    正则表达式的这一部分用于匹配1中的1,1,000中的1,000.,所以我们的数字是1,000.(与最后.

    到目前为止,正则表达式已与1,000匹配,然后无法找到另一个,来重复数千个组,因此它会转到我们的(?=[,.](\s|$))

    (?=....)意味着它是一个先行者,这意味着我们已经匹配到哪里,看看会发生什么,但不要将它添加到比赛中。

    所以它检查是否有,.,如果有,它会检查它是否紧跟空格或输入结束。在这种情况下它是,所以它将匹配保留为1,000

    如果前瞻不匹配,它会继续尝试匹配小数位。

答案 1 :(得分:1)

这适用于您列出的所有

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

答案 2 :(得分:0)

.表示“任何角色”。要使用文字.,请将其转义为:\.

据我所知,这是唯一遗漏的东西。