Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式数字长度仅为5或9_Php_Regex - Fatal编程技术网

PHP正则表达式数字长度仅为5或9

PHP正则表达式数字长度仅为5或9,php,regex,Php,Regex,我需要一个用于字符串验证的正则表达式。字符串可以为空,可以有5位数字,也可以有9位数字。其他情况无效。我正在使用下一个正则表达式: /\d{5}|\d{9}/ 但是它不起作用。“不起作用”没有多大帮助。但不是这样吗 /^(\d{5}|\d{9}|)$/ (在regexp上有点生疏,但我尝试做的是“开始,然后是5位数或9位数,或者什么都没有,然后是结束”) 您忘记了锚点^和$。没有锚点,字符串将与字符串中的任何位置匹配,而不仅仅是在开头或结尾。此外,您没有涵盖空字符串的大小写。使用锚点和“?”

我需要一个用于字符串验证的正则表达式。字符串可以为空,可以有5位数字,也可以有9位数字。其他情况无效。我正在使用下一个正则表达式:

/\d{5}|\d{9}/
但是它不起作用。

“不起作用”没有多大帮助。但不是这样吗

/^(\d{5}|\d{9}|)$/
(在regexp上有点生疏,但我尝试做的是“开始,然后是5位数或9位数,或者什么都没有,然后是结束”)

您忘记了锚点
^
$
。没有锚点,字符串将与字符串中的任何位置匹配,而不仅仅是在开头或结尾。此外,您没有涵盖空字符串的大小写。

使用锚点和“?”来允许空字符串

/^(\d{5}|\d{9})?$/
正如,我将使用以下正则表达式:

/^(\d{5}(\d{4})?)?$/
这正好匹配五个数字,后面可能跟另外四个数字(总共九个数字),或者根本没有字符(请注意,数字表达式周围的
量词使组成为可选的)


与其他提到的具有交替的模式相反,这种模式的优点是,如果匹配五位数字失败,则不需要回溯。

关于它为什么不起作用的答案是,Perl风格的正则表达式的交替从左到右排列优先级

将其更改为:

/\d{9}\d{5}/
(不过,这不会告诉您关于6-8和10无穷大的任何其他信息 除非它被断言或其他东西锚定。)


/^(\d{5}| \d{9}|)$/
/^(\d{5})(\d{4})$/
?假设数字是字符串中唯一的内容,这将匹配5个数字,可选地后跟4个以上。@MarcB:这甚至在语法上都无效。cuirous,空字符串会告诉你什么?更好的方法来进行邮政编码验证…可能的重复
/^(\d{5}(\d{4})?)?$/