Php PCRE:为lookarounds定义语句
深入正则表达式的世界,我在Php PCRE:为lookarounds定义语句,php,regex,pcre,Php,Regex,Pcre,深入正则表达式的世界,我在PCRE中遇到了DEFINE语句 我有以下代码(它定义了一个小写、一个大写和anA组(我知道在这一点上它很无用,谢谢:): 如何使用上述子例程实现这一点 编辑:作为参考,我最终使用了: (?(定义) (?(?=[^a-z\n]*[a-z])小写 (?(?=[^A-Z\n]*[A-Z])大写 (?(?=[^\d\n]*\d))#位 (?(?=.[!@]+)#特殊字符 ) ^(?&lc)(?&uc)(?&Digital)(?&special)。{6,}$ 如何将looka
PCRE
中遇到了DEFINE
语句我有以下代码(它定义了一个小写、一个大写和
anA
组(我知道在这一点上它很无用,谢谢:):
如何使用上述子例程实现这一点
编辑:作为参考,我最终使用了:
(?(定义)
(?(?=[^a-z\n]*[a-z])小写
(?(?=[^A-Z\n]*[A-Z])大写
(?(?=[^\d\n]*\d))#位
(?(?=.[!@]+)#特殊字符
)
^(?&lc)(?&uc)(?&Digital)(?&special)。{6,}$
如何将lookahead(lowercase
在本例中)与anA
部分相结合
通过使用(?&lowercase)
命名子例程调用,可以使用与使用anA
相同的方法递归子模式:
/(?(DEFINE)
(?<lowercase>(?=[^a-z]*[a-z])) # lowercase
(?<uppercase>(?=[^A-Z]*[A-Z])) # uppercase
(?<anA>A(?=B))
)
^(?&lowercase)(.*?)((?&anA)).*
/mgx
/(?(定义)
(?(?=[^a-z]*[a-z])小写
(?(?=[^A-Z]*[A-Z])大写
(?。请注意,您需要在regex101.com上使用/x
修饰符指定VERBOSE/IgnorePatternWhitespace/Freespace模式才能使用此模式
不过,如果您还想定义*
和*?
子模式,请注意一点(请参阅):
所有子例程调用,无论是递归调用还是非递归调用,都始终被视为原子组。。也就是说,一旦子例程匹配了某些主题字符串,就永远不会重新输入,即使它包含未经试验的替代项,并且随后会出现匹配失败。在子例程调用期间设置的任何捕获括号都会重新输入之后,将vert设置为其以前的值
Jan,你能澄清一下我如何将lookahead(lowercase
在本例中)与anA
部分相结合吗?你想在输入字符串中匹配什么?你在演示中没有使用x-flag作为注释模式(在^
行开始之前匹配新行).这可能会混淆你的期望。Rexegg有一些章节是关于.或的。@WiktorStribiżew:它是a)用于学习目的,b)用于学习目的用于密码验证。我知道我可以自己编写lookaheads,但是我希望它有点像块一样。我会更新问题以使其更清楚。只需递归子模式,就像您使用anA
所做的那样:只有一个警告:所有子例程调用,无论是否递归,都被视为原子调用组。也就是说,一旦一个子例程匹配了某些主题字符串,它就永远不会被重新输入,即使它包含未尝试过的替代项,并且随后出现匹配失败。在子例程调用期间设置的任何捕获括号在之后都会恢复到它们以前的值。再次感谢Wiktor(链接已断开)。
^(?=[^a-z]*[a-z]).*?A(?=B).*
(?(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,}$
/(?(DEFINE)
(?<lowercase>(?=[^a-z]*[a-z])) # lowercase
(?<uppercase>(?=[^A-Z]*[A-Z])) # uppercase
(?<anA>A(?=B))
)
^(?&lowercase)(.*?)((?&anA)).*
/mgx