我很难找到包含逗号分隔符的十进制数的正确正则表达式。
我确实在一般情况下找到了一些关于这个问题的其他问题,但是当我测试它们时,没有一个答案真的有效
到目前为止我得到的最好的是:
[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
(应该忽略数字末尾的逗号或点)。
非常感谢!
答案 0 :(得分:3)
这是一个非常长而且复杂的正则表达式,可以满足您的所有要求。如果您的正则表达式引擎基于PCRE(希望您使用的是PHP,Delphi或R ..),它将起作用。
(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$))
使事情变得如此之久的事情:
.
和,
结尾的数字而不包括匹配中的.
或,
需要另一个预测。 (?=[,.](\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)
.
表示“任何角色”。要使用文字.
,请将其转义为:\.
。
据我所知,这是唯一遗漏的东西。