正则表达式带逗号的十进制数

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, 中的11,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

如何使用正则表达式从字符串中删除字符串和特殊字符并仅显示不带逗号的数字?

php写一个正则表达式 匹配逗号

如何在 R 中使用正则表达式查找不带逗号的潜文本?