正整数的非空CSV字符串的正则表达式

时间:2015-10-13 06:20:59

标签: php regex

我试图编写一个正则表达式来检查字符串是否匹配带有正整数的非空CSV模式,例如34,657547,453,346654,还有{{1}这样的单个整数}或2

我尝试3943作为正则表达式(如this SO-question中所述并删除允许空字符串的部分),但如果我在https://regex101.com/上尝试使用我的示例输入{ {1}}它告诉我唯一的匹配是^\d+(,\d+)*$。如果我尝试34,657547,453,346654,则表示没有匹配

根据我的理解:

,346654

所以我也有问题:

  1. 那么我需要改变什么,我得到了我需要的东西?
  2. 有没有办法不允许零作为单一条目?因此34^ // Start of String \d+ // A digit, at least one time ( ...) // Grouping for the next ,\d+ // a comma and at least one digit * // Repeating the grouping zero to unlimited times $ // End of String 无效。我考虑在我的正则表达式中使用34,0,354而不是0,但这样可以删除像[1-9]这样的数字。
  3. 最后,我想到了一个包含这样一个函数的脚本:

    \d

1 个答案:

答案 0 :(得分:1)

正如ClasG在评论中指出的那样,你的正则表达式正在发挥作用。它确实匹配整条线,只捕获匹配的las标记。小组(,\d+)*会在重复时被覆盖。

要排除匹配的0令牌,您可以使用以下表达式:

/^0*[1-9]\d*(?:,0*[1-9]\d*)*$/

regex101 demo

如您所见,对于每个数字,它匹配:

0*          # any number of leading zeros
[1-9]       # requires 1 digit different than 0
\d*         # any number of digits

还有一件事,你要检查是否preg_match($regEx, $string) > 1。但是,如果匹配,则preg_match仅返回1,否则返回0(我们不使用偏移量)。你可以简单地返回值:

return preg_match($regEx, $string);