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次是否更容易

编辑: 虽然我的完整正则表达式有点复杂,但可以重复xy次的部分非常简单[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)中提供的命名子模式。这也是一种计算表达式因子的函数方法。反向引用不会重复前面的模式,它会匹配之前匹配的实际字符串。这是我的心不在焉。我已经编辑了我的帖子来纠正我的错误。