Php 一种更简单的匹配模式的方法,可以是x或y倍
我正在尝试编写一个正则表达式来验证数字代码。代码可以是几个有效长度中的一个,但不是两个长度之间的所有长度。我知道我可以做像这样的事情Php 一种更简单的匹配模式的方法,可以是x或y倍,php,regex,preg-match,Php,Regex,Preg Match,我正在尝试编写一个正则表达式来验证数字代码。代码可以是几个有效长度中的一个,但不是两个长度之间的所有长度。我知道我可以做像这样的事情 preg_match("/^([0-9]{".$x."}|[0-9]{".$y".})$/", "$string") 但不必为每个有效长度重复子模式。特别是我的实际正则表达式已经变得很复杂了 preg_match("/^[0-9]{".$x.",&quo
preg_match("/^([0-9]{".$x."}|[0-9]{".$y".})$/", "$string")
但不必为每个有效长度重复子模式。特别是我的实际正则表达式已经变得很复杂了
preg_match("/^[0-9]{".$x.",".$y."})$/", "$string")
显然对我不起作用,因为它还将匹配$x
和$y
之间的任意数字
使用正则表达式来匹配模式的x或y次是否更容易
编辑:
虽然我的完整正则表达式有点复杂,但可以重复x或y次的部分非常简单[0-9],因此,和给出的答案虽然有趣,但在这种特殊情况下无法解决问题
特别是我的实际正则表达式已经变得很复杂了
preg_match("/^[0-9]{".$x.",".$y."})$/", "$string")
那么这是所有正则表达式领域中唯一可用的替代方法
我想,因为这是PHP,所以您可以在函数中放入一个单数单位,然后在一系列交替中使用范围量词调用函数
您可以将函数重命名为描述性稍差的函数,如a、B或C…最大的优点是可以插入其他分隔符代码,例如
(?:(?&digit)\s*){4}
或任何您想要的
# \b(?:(?&digit){4}|(?&digit){7}|(?&digit){9}|(?&digit){11})\b(?(DEFINE)(?<digit>[0-9]))
\b # add a boundary here
(?:
(?&digit){4} # match 4 times
| (?&digit){7} # or, match 7 times
| (?&digit){9} # or, match 9 times
| (?&digit){11} # or, match 11 times
)
\b # add a boundary here
(?(DEFINE) # Add complex expressions here
(?<digit> [0-9] ) # (1)
)
将复杂模式放入变量中,然后在regexp中使用该变量
$pat = 'complex pattern';
preg_match("/^($pat{" . $x . "}|$pat{" . $y . "})$/", $string);
顺便说一句,我必须使用串联而不是替换,才能在regexp的
{}
中得到$x
和$y
。这是因为{$var}
是PHP字符串中“复杂变量替换”的语法,因此{}
不会出现在结果字符串中。请参阅上的PHP文档。正如您所做的那样,您不能将范围运算符分组以重复前面的标记,因为前面的标记是不可量化的。例如,^\d(?:{3}{10})$
将不起作用。@hwnd我很害怕。你想把它作为一个答案吗?嗯,不仅仅是重复表达的交替。函数调用总是存在的。ie;php(PCRE)中提供的命名子模式。这也是一种计算表达式因子的函数方法。反向引用不会重复前面的模式,它会匹配之前匹配的实际字符串。这是我的心不在焉。我已经编辑了我的帖子来纠正我的错误。