验证此
输入的正则表达式是什么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}
我试过这个
if( preg_match('/(PROJ)[0-9]{4}(-|_)?[0-9]+)/', $input) )
{
}
我可以拆分并且可以像下面这样进行验证,但我想通过单个正则表达式
来实现 foreach(explode('-',$input) as $e)
{
if( !preg_match('/(PROJ)[0-9]{4}(-|_)?[0-9]+)/', $e) )
{
return 'Invalid Input';
}
}
输入可以只用PROJ和4位数字
作为前缀PROJ9450
OR
输入可以用PROJ和4位数字作为前缀 - 以PROJ和。为前缀 这样的4位数字最多为
n
PROJ9400-PROJ9401-PROJ9402 ..... PROJ {n}
OR
输入可以用PROJ和4位数字的非核心数字作为前缀 - 以PROJ为前缀和4位数字下划线数字,如下所示
n
PROJ9400_1-PROJ9400_2-PROJ9401_1-PROJ9402_1 ... PROJ {n} _ {n}
答案 0 :(得分:4)
您需要匹配以PROJ
开头的块,然后是4位数字(可选地后跟-
或_
和1+位数)重复
使用
/^(PROJ[0-9]{4}(?:[-_][0-9]+)?)(?:-(?1))*$/
请参阅regex demo
<强>详情:
^
- 字符串anchor (PROJ[0-9]{4}(?:[-_][0-9]+)?)
- 第1组(稍后将使用(?1)
recursion construct递归)捕获:
PROJ
- 文字字符序列[0-9]{4}
- 4位数(?:[-_][0-9]+)?
- 可选的(1或0次出现)
[-_]
- character class匹配-
或_
[0-9]+
- 一位或多位(?:-(?1))*
- 出现零次或多次-
,然后是第1组子模式,直到...... $
- 字符串结尾(最好将其替换为匹配字符串末尾的\z
锚点。)