2

我试过了:

preg_match("/((\d)+,?)+/",$string)

它返回正确的结果:

1,2,3,4,5

但它也匹配:

1,2a

1aaaa

1,2,3,

我怎样才能解决这个问题?

4

3 回答 3

3

你可以做

^\d+(,\d+)*$

第一个^\d+匹配字符串的开头和一个数字。然后,您可以选择匹配一个逗号后跟一个数字(并且该组可以出现 0 次或多次)。最后$匹配字符串的结尾。确保在最后一个数字之后没有任何剩余。

这是一个显示表达式如何工作的状态机:

正则表达式图片

在 Debuggex 上实时编辑

这可以匹配例如 : 8, 1,2,4.
但不会匹配 : 8,,,21,2a

于 2013-05-31T16:00:21.000 回答
1

您可以使用锚点^$阻止其他匹配:

preg_match("/^((\d)+,?)+$/",$string)
             ^          ^

虽然......你的表达可能会更好:

preg_match("/^\d+(,\d+)*$/",$string)

发生的事情((\d)+,?)+是它匹配它找到的前几个字符,一旦完成,它就会说它匹配。

锚点^$分别表示字符串的开头和结尾,表示开头必须匹配到结尾。

于 2013-05-31T15:57:25.067 回答
0

尝试这个:

preg_match('~^(?:\d+(?:,(?!$)|$))+$~', $string);
于 2013-05-31T16:02:05.273 回答