Regex不工作,接受几乎所有的字母数字组合


regex not working, accepting almost all letter number combinations

谁能告诉我我做错了什么?这是接受所有匹配。

if (preg_match("/^[A-Z][a-z][a-z][0-9]|[1-9][0-9]|1[0-4][0-9]|15[0-1]:[0-9]|[1-9][0-9]|1[0-6][0-9]|17[0-6]/", $_GET['id']))
 {
 echo "match";
 }
 else
 {
 echo "no match";
 }

我希望它只匹配如果第一个字母是大写字母a-z,第二个字母是小写字母a-z,第三个字母是小写字母a-z,然后是1和150之间的数字,冒号:,然后是1和176之间的数字。它应该匹配Abc150:176 Zyx1:1,但不匹配aBc151:177

使用

^[A-Z][a-z]{2}(?:[1-9][0-9]?|1[0-4][0-9]|150):(?:[1-9][0-9]?|1[0-6][0-9]|17[0-6])$

看演示。

  • ^断言我们位于字符串
  • 的开头。
  • [A-Z][a-z]{2}匹配一个大写字母和两个小写字母
  • (?:[1-9][0-9]?|1[0-4][0-9]|150)匹配从1到150的数字
  • :匹配冒号
  • (?:[1-9][0-9]?|1[0-6][0-9]|17[0-6])匹配从1到176的数字
  • $断言我们位于字符串
  • 的末尾
php:

$regex = "~^[A-Z][a-z]{2}(?:[1-9][0-9]?|1[0-4][0-9]|150):(?:[1-9][0-9]?|1[0-6][0-9]|17[0-6])$~";
echo (preg_match($regex,$string)) ? "***Match!***" : "No match";

您需要将表达式放置在parent中的交替操作符(|)周围,否则它将匹配左侧和右侧的所有内容。就像你现在看到的,当你说Aaa1或Aaa10时,它匹配Aaa1或10。试一试:

/^[A-Z][a-z][a-z]([0-9]|[1-9][0-9]|1[0-4][0-9]|15[0-1]):([0-9]|[1-9][0-9]|1[0-6][0-9]|17[0-6])/