2017-02-24 89 views
0

我想做正则表达式,我想用小数点逗号检查正确的十进制格式。正确的价值观的正则表达式和十进制格式

的例子是:

1,23 
123456,1 
123.456,78 
1 
12345 
123.456 

我已经是:

^((\d(\d)*|((\d){1,3}(.\d{3})*))(\,\d{1,2})?)?$ 

当我测试了我的代码,我发现,源23,000匹配(它不应该)和1223,000不符(这是正确的)。

为什么在某些情况下,它会在逗号后找到3位数作为匹配?

+0

为什么它不匹配'23,000'?逗号后的数字太多了? –

+0

您能澄清验证目标吗? – Niitaku

+0

您的正则表达式中有一个未转义的点,应该可能会逃脱。它也似乎过于复杂。 –

回答

2

那么首先这里是我会检查你的电话号码格式:

^(?:\d+|\d{1,3}(?:\.\d{3})*)(?:,\d{1,2})?$ 
  • (?:pattern)是一个非捕获组,你应该用它来组的东西,你实际上并不需要捕获。
  • \d+匹配一个或多个数字
  • \d{1,3}(?:\.\d{3})*比赛1至3位数,随后的点和3位的一个或多个次
  • (?:,\d{1,2})?逗号之后是一个或两个数字,可选匹配

请参阅https://regex101.com/r/XrLpXR/1

但是您的实际问题是为什么23,000与您的模式相匹配,而1234,000则不是。首先,让我们您的正则降低到了实际参与比赛的部分:

^\d{1,3}(.\d{3})*$ 

所以匹配1到3位数,那么任何字符(注意转义点)和3码,零次或多次。

23,000比赛2个位数,则逗号(任何字符),然后3位数字 1234,000无法比拟1234与3位和无法比拟的4用点,为逗号如下。