正则表达式带逗号的十进制数
Posted
技术标签:
【中文标题】正则表达式带逗号的十进制数【英文标题】:Regex a decimal number with comma 【发布时间】:2013-11-22 20:59:41 【问题描述】:我很难为包含逗号分隔符的十进制数找到正确的正则表达式。
我确实发现了一些关于这个问题的其他问题,但是当我测试它们时,没有一个答案真的有效
到目前为止我得到的最好的是:
[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
(应忽略数字末尾的逗号或点)。
非常感谢! .
【问题讨论】:
对于初学者,除非您的语言的正则表达式库已经这样做了,否则您可能应该在两端锚定您的模式。否则,任何包含至少一位数字的字符串都会匹配。 您允许正则表达式中带有句点 (.
) 的空格,它匹配任何字符。转义句点 (\.
) 以仅匹配句点。
我认为第二个和第三个问题根本不是问题。据我所知,他们不会匹配他们不应该匹配的。
OP 我们需要知道您使用的是哪个正则表达式引擎...如果后向和前瞻都可用,我只能让它绝对适用于所有情况(包括仅由空格分隔的数字)。
我在 c# 上使用正则表达式。
【参考方案1】:
这是一个非常长且复杂的正则表达式,可以满足您的所有要求。如果您的正则表达式引擎基于 PCRE(希望您使用的是 php、Delphi 或 R..),它将起作用。
(?<=[^\d,.]|^)\d1,3(,(\d3))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$))
DEMO on RegExr
让它如此漫长的原因:
-
匹配同一行上的多个数字,仅由 1 个字符(空格)分隔,同时不允许部分匹配,需要先行后行。
匹配以
.
和,
结尾但不包括.
或,
的数字需要再次前瞻。
(?=[,.](\s|$))
说明
在编写此说明时,我意识到 \s
必须是 (\s|$)
才能匹配字符串末尾的 1,
。
这部分正则表达式用于匹配1,
中的1
或1,000.
中的1,000
,所以假设我们的号码是1,000.
(最后是.
)。
到目前为止,正则表达式已匹配 1,000
,然后它找不到另一个 ,
来重复数千组,因此它转到我们的 (?=[,.](\s|$))
(?=....)
表示它是一个前瞻,这意味着从我们匹配到的位置,看看接下来会发生什么,但不要将其添加到匹配中。
所以它会检查是否有,
或.
,如果有,它会检查它后面是否紧跟空格或输入结尾。在这种情况下是这样,所以它会将匹配保留为1,000
如果前瞻不匹配,它会继续尝试匹配小数位。
【讨论】:
到目前为止,它似乎工作得很好。我会再测试一下。非常感谢!你能解释一下吗:(?=[,.]\s)? 啊,太好了,我会在答案中添加这个解释。 答案已更新 - 我也必须对正则表达式稍作更改以允许出现边缘情况。【参考方案2】:这适用于您列出的所有内容
^[0-9]1,3(,[0-9]3)*(([\\.,]1[0-9]*)|())$
【讨论】:
带有 ^$ 标签它什么也不返回。对于上面没有它的例子,返回的例子多于几个不应该匹配的例子。【参考方案3】:.
表示“任何字符”。要使用文字 .
,请将其转义为:\.
。
据我所知,这是唯一缺少的东西。
【讨论】:
他想在同一行匹配多个数字,因此使用他当前的正则表达式,他得到了各种不需要的匹配:DEMO 有哪些不需要的匹配项?底线有部分匹配,但这些是有效数字。 OP 极不可能对他列为不匹配的输入进行部分匹配。就像我问你列表中的正数1 -2 -3
,你返回"1", "2" and "3"
。当然,这些是列表中出现的正数,但它们已被排除在任何有用的上下文之外。
在这种情况下,他应该指定什么是有效的。例如,1,2,3,4
是逗号分隔的数字列表,还是无效数字?以上是关于正则表达式带逗号的十进制数的主要内容,如果未能解决你的问题,请参考以下文章
使用 jquery 验证器插件仅为 2 个十进制数字 + 点 + 逗号设置正则表达式
C#:更改正则表达式的 NumberDecimalSeparator