更深入地了解正则表达式世界,我在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,}$
答案 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),请注意警告:
所有子程序调用(无论是否递归)始终被视为原子组。也就是说,一旦子程序匹配某些主题字符串,它就永远不会被重新输入,即使它包含未经验证的替代方案并且存在后续匹配失败。在子程序调用期间设置的任何捕获括号都会在之后恢复为之前的值。