2013-11-22 118 views
5

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

我没有找到关于这个问题一般,但没有一个答案时,我测试了他们真正工作了几个其他的问题

我迄今为止最好的是:如此

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

2存在的主要问题远:

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 

(在一个逗号或点数量的末尾应该被忽略)。

非常感谢! 。

+0

对于初学者来说,除非你的语言的正则表达式库已经这样做,否则你应该在两端都固定你的模式。否则,任何至少有一个数字的字符串都会匹配。 – cHao

+0

您允许使用与任何字符匹配的句点('''.''')的正则表达式中的空格。退出期间('''\ .''')仅与期间匹配。 – creemama

+0

我不认为第二个和第三个问题都是问题。从我所知道的情况来看,他们不会匹配他们不应该做的事情。 –

回答

2

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

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

DEMO on RegExr

,它使得长的东西:

  1. 上仅通过1个字符(空格)而不是允许分批配衬分开的相同线路匹配多个号码需要先行和一个向后看。
  2. 匹配号码以.,结尾,不包括.,在比赛中需要另一个预测。

(?=[,.](\s|$))说明

当写这个解释我才意识到\s需要是(\s|$)在一个字符串的结尾处匹配1,

正则表达式的这一部分是匹配1,000.1,11,000让我们说,我们的数量是1,000.(与.的结束)。

到此为止正则表达式匹配了1,000,那么就无法找到另一个,重复上千组,以便它移动到我们(?=[,.](\s|$))

(?=....)意味着它的先行,从那里我们有手段匹配起来,看看什么来了,但不加入比赛。

因此,它检查是否有,.,如果有,它会检查紧接着是空白还是输入结束。在这种情况下,它是这样的,所以它将离开比赛作为1,000

如果前瞻不匹配,它会移动到尝试匹配小数位。

+0

到目前为止,它似乎很好。我会再测试一下。非常感谢! 请你解释一下:(?= [,。] \ s)? – LiranBo

+0

啊,太棒了,我会添加解释的答案。 – OGHaza

+0

答案更新 - 我必须对正则表达式进行一些细微的更改才能考虑边缘情况。 – OGHaza

1

这项功能对您列出

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

它不返回任何内容。 对于没有它的上述示例,会返回多个应该没有匹配的示例。 – LiranBo

0

.意味着“任何字符”的所有的人。要使用文字.,请像这样转义它:\.

据我所知,这是唯一缺少的东西。

+0

他想在同一行上匹配多个数字,所以用他当前的正则表达式,他会得到各种不需要的匹配:[DEMO](http://regexr.com?37asm) – OGHaza

+0

有什么不需要的匹配?底线有部分匹配,但这些都是有效的数字。 –

+0

OP极不可能对他列为不匹配的输入进行部分匹配。这就像我问你在列表'1 -2 -3'中的正数,并且你返回''1','2'和'3''。确定这些是在列表中出现的正数,但是它们已经从任何有用的上下文中取出。 – OGHaza

相关问题