验证这个
输入的正则表达式是什么?以下3行为有效
PROJ9450
PROJ9400-PROJ9401-PROJ9402 ..... PROJ{n}
PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1-PROJ9408 ... PROJ{n}_{n}
以下行为无效字符串
PROJ450
PRO1223
PROJ9400a-PROJ9401-PROJ9400-PROJ1929-1-PROJ1929
PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1-PROJs453 ... PROJ{n}_{n}
I tried this
if( preg_match('/(PROJ)[0-9]{4}(-|_)?[0-9]+)/', $input) )
{
}
我可以像下面这样分割和验证,但我想通过单个regex
来实现这一点 foreach(explode('-',$input) as $e)
{
if( !preg_match('/(PROJ)[0-9]{4}(-|_)?[0-9]+)/', $e) )
{
return 'Invalid Input';
}
}
输入可以只以PROJ和4位数字作为前缀
PROJ9450
或
输入可以前缀为PROJ和4位数字-前缀为PROJ和像这样的4位数字,直到
n
PROJ9400-PROJ9401-PROJ9402……项目{n}
或
输入可以以PROJ和4位数字为前缀,不带核心数字-前缀是PROJ和像这样的4位数下划线数字
n
PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1……项目{n} _ {n}
您需要匹配以PROJ
开始,后跟4位数字(可选后跟-
或_
和1+数字)的块重复
/^(PROJ[0-9]{4}(?:[-_][0-9]+)?)(?:-(?1))*$/
查看regex演示
:
-
^
-字符串锚 -
(PROJ[0-9]{4}(?:[-_][0-9]+)?)
-组1(稍后将与(?1)
递归构造递归)捕获:-
PROJ
-一个字面值字符序列 -
[0-9]{4}
- 4位 -
(?:[-_][0-9]+)?
-可选的(出现1或0次)-
[-_]
-一个字符类匹配-
或_
-
[0-9]+
- 1位或更多位
-
-
-
(?:-(?1))*
--
零次或多次出现,随后是第1组子模式,直至… -
$
-字符串的结束(最好用'z
锚匹配字符串的末尾)。