逗号分隔数字的正则表达式

6
我会尽力为您进行翻译,以下是您需要翻译的内容:

我正在尝试验证用户输入,这只是由逗号分隔的数字。我想使用正则表达式来完成此操作,但无法想出正确的表达式。

它应该验证以下字符串(以及更大的字符串):

1
12
123
1,234
12,345
123,456

并使以下字符串(和更疯狂的)无效:
1,1
1,12
12,1
12,12
123,1
123,1

任何帮助都将不胜感激。
以下是我迄今尝试过的方法(编辑:这些方法都无效),以及几个变体 ->
^(((\d{1,3},)*\d{3})|(\d{1,3}))$
^(\d{1,3}[,])*\d{3}|\d{1,3}$
1个回答

15
这样怎么样?
^\d{1,3}([,]\d{3})*$

基本上,你可以有1-3位数字而无需使用逗号。之后,你就需要一个逗号。如果你有一个逗号,那么它必须后跟3个以上的数字。这种逗号-3位数序列可以出现任意次数。

编辑: 正如Andrew Hare所观察到的那样,你不在乎括号内发现了什么,只要注意到匹配即可,因此可以在开括号后面放置?:, 以使用非捕获组。

^\d{1,3}(?:[,]\d{3})*$

3
做得很好。我的唯一批评是:由于这个正则表达式仅用于验证,您应该将该捕获组更改为非捕获组。 - Andrew Hare
2
好观点,但一直让我困扰的是,将组设置为非捕获会使正则表达式更加丑陋。 - Adam Bellaire
看原始的正则表达式,它看起来像一个字符串,如12,1,123是合法的((\d{1,3},)*\d{3}),而上面的内容并不满足。 - Rune FS
@Rune FS:OP 表示原始正则表达式并未按照他的意图工作。这就是为什么他提供了测试输入的原因。 - Adam Bellaire
这会验证 "123,456123,456" 吗? - Faiz
@Faiz:那个字符串无效,这个正则表达式会显示出来。试一下吧。 :) - Adam Bellaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接