根本的区别在于以下事实:非捕获组仍会消耗它们匹配的字符串部分,从而使光标向前移动。
一个与之根本不同的示例是,当您尝试匹配某些字符串时,这些字符串被某些边界包围并且这些边界可以重叠。示例任务:
匹配
a给定字符串中被
bs包围的所有s-给定的字符串为
bababaca。应该在位置2和4进行两次比赛。
使用环视很容易,您可以使用
b(a)(?=b)或
(?<=b)a(?=b)进行匹配。但
(?:b)a(?:b)不会起作用-
第一场比赛还将消耗位置3处的b,这是第二场比赛的边界。(注意:这里实际上不需要非捕获组)
另一个比较突出的示例是密码验证-检查密码中是否包含大写,小写字母,数字等内容-您可以使用一堆替代字词来匹配这些字符-但提前查找会更容易:
(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!?.])
与
(?:.*[a-z].*[A-Z].*[0-9].*[!?.])|(?:.*[A-Z][a-z].*[0-9].*[!?.])|(?:.*[0-9].*[a-z].*[A-Z].*[!?.])|(?:.*[!?.].*[a-z].*[A-Z].*[0-9])|(?:.*[A-Z][a-z].*[!?.].*[0-9])|...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)