我在使用模式正确验证字符串条目时遇到了一些麻烦。这个赋值的PHP部分工作正常,所以我不会在这里包含它,以使这更容易阅读。有人能告诉我为什么这种模式与我想要做的不匹配吗?
此模式具有以下验证要求:
后跟1-3位
$codecheck = '/^([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?)\d{1,3}$/';
目前,这可以满足大部分要求,但它似乎只能验证最低字符要求 - 并且当输入的字符数超过6或3个字符时,不会返回false。
提前感谢您的任何帮助!
答案 0 :(得分:4)
这里的问题在于如何对备选方案进行分组。现在,正则表达式匹配
的字符串^([[:lower:]]{3,6}-)
- 以3-6个小写字母开头,后跟连字符|
- 或([[:lower:]]{3,6} ?)\d{1,3}$
- 以3-6个小写字母结尾,后跟可选空格,后跟1-3位数字。事实上,你可以完全摆脱交替:
$codecheck = '/^\p{Ll}{3,6}[- ]\d{1,3}$/';
请参阅regex demo
解释:
^
- 字符串开头\p{Ll}{3,6}
- 3-6个小写字母[- ]
- 匹配一个字符(连字符或空格)的正字符类\d{1,3}
- 1-3位数$
- 字符串结尾答案 1 :(得分:2)
您需要在正则表达式中间划分|
运算符的范围。
现在:
OR的右侧参数一直运行到正则表达式的最后,甚至包括$
。因此,字符串结束条件的数字 或 不适用于|
的左侧。
OR的左侧参数以^
开头, 仅 适用于左侧。
这就是为什么在提供7个小写字符时获得匹配的原因。第一个字符被忽略,其余字符与正则表达式模式的右侧匹配。