正则表达式匹配PHP中的非负整数?

dat*_*.io 7 php regex

我似乎通过preg_match()使用以下正则表达式:

@^(?:[1-9][0-9]*)|0$@
Run Code Online (Sandbox Code Playgroud)

然而,考虑到正则表达式中根本没有" - ",它与'-0'匹配是奇怪的.为什么?

更奇怪的是,如果你将部分切换为|:

@^0|(?:[1-9][0-9]*)$@
Run Code Online (Sandbox Code Playgroud)

它匹配所有负整数,如'-2'和'-10'等.

我在这里错过了什么?非负整数的任何更好的正则表达式?

cod*_*ict 6

你的正则表达式: @^(?:[1-9][0-9]*)|0$@

  1. 说匹配那些1-9以任何数字开头的数字0或者更多的数字OR
  2. 匹配那些以...结尾的数字0.

显然-0满足条件2所以你得到了匹配.

你需要的正则表达式是: @^(?:[1-9][0-9]*|0)$@

匹配0或任何其他+ve数字没有领先0.如果允许前导0,那么您需要检查的是输入是否包含您可以使用的数字:^\d+$Mark提及.

另外,为什么不做一个简单的检查:

if($input >= 0)
 // $input is non -ve.
Run Code Online (Sandbox Code Playgroud)