PCRE:关于外观的DEFINE声明

时间:2016-03-21 08:02:43

标签: php regex pcre

更深入地了解正则表达式世界,我在DEFINE中遇到了PCRE声明。
我有以下代码(定义了一个小写,一个大写和anA组(我知道它在这一点上相当无用,谢谢:):

(?(DEFINE)
 (?<lowercase>(?=[^a-z]*[a-z])) # lowercase
 (?<uppercase>(?=[^A-Z]*[A-Z])) # uppercase
 (?<anA>A(?=B))
)
^(?&anA)

现在,我想知道如何将前瞻(本例中为lowercase)与anA部分结合起来?不可否认,努力寻找DEFINE语法的适当文档。这是a regex101.com fiddle 为了使它更清晰,我希望有机会组合子程序。例如,通过上面的示例(要验证密码需要A后跟B和一些小写字母),我可以do the following

^(?=[^a-z]*[a-z]).*?A(?=B).*

如何使用上述子程序完成这项工作?

编辑:作为参考,我最终使用了following construct

(?(DEFINE)
 (?<lc>(?=[^a-z\n]*[a-z]))      # lowercase
 (?<uc>(?=[^A-Z\n]*[A-Z]))      # uppercase
 (?<digit>(?=[^\d\n]*\d))       # digit
 (?<special>(?=.*[!@]+))        # special character
)
^(?&lc)(?&uc)(?&digit)(?&special).{6,}$

1 个答案:

答案 0 :(得分:2)

  

如何将前瞻(本例中为>> choose_and_combine({'a1','a2'},{'b1'}) 'a1b1' 'a2b1' >> choose_and_combine({'a1','a2'},{'b1'},{'c1','c2'}) 'a1b1c1' 'a1b1c2' 'a2b1c1' 'a2b1c2' >> choose_and_combine({'a1','a2'},{'b1','b2','b3'},{'c1','c2'}) 'a1b1c1' 'a1b1c2' 'a1b2c1' 'a1b2c2' 'a1b3c1' 'a1b3c2' 'a2b1c1' 'a2b1c2' 'a2b2c1' 'a2b2c2' 'a2b3c1' 'a2b3c2' )与lowercase部分

结合起来

使用anA命名子例程调用,可以使用与anA相同的方式递归子模式:

(?&lowercase)

请参阅regex demo。请注意,您需要在regex101.com上使用/(?(DEFINE) (?<lowercase>(?=[^a-z]*[a-z])) # lowercase (?<uppercase>(?=[^A-Z]*[A-Z])) # uppercase (?<anA>A(?=B)) ) ^(?&lowercase)(.*?)((?&anA)).* /mgx 修饰符指定VERBOSE / IgnorePatternWhitespace / Freespace模式,以使此模式生效。

如果你想要定义/x.*子模式(参见PCRE Man Pages),请注意警告:

  

所有子程序调用(无论是否递归)始终被视为原子组。也就是说,一旦子程序匹配某些主题字符串,它就永远不会被重新输入,即使它包含未经验证的替代方案并且存在后续匹配失败。在子程序调用期间设置的任何捕获括号都会在之后恢复为之前的值。