在 Java 正则表达式中匹配 y 个组中的 x 个
Posted
技术标签:
【中文标题】在 Java 正则表达式中匹配 y 个组中的 x 个【英文标题】:Match x out of y groups in Java regex 【发布时间】:2015-07-23 12:14:30 【问题描述】:是否可以在 Java 中编写一个匹配例如 3 个组中的 2 个(或 4 个组中的 3 个等)的正则表达式?
例如,我有以下正则表达式:
((?=.*\d)(?=.*[a-z])(?=.*[A-Z]))
这将只允许匹配所有三个组的模式 - 即它必须包含一个数字和一个小写字符和一个大写字符。我想让它验证一个模式,该模式至少包含三个组中的两个(例如一个数字和一个大写字符或一个小写和大写字符)。
是否可以在单个语句中执行,还是我必须编写单独的正则表达式并循环遍历它们?
【问题讨论】:
(?=.*\d)(?=.*[a-z])|(?=.[a-z])(?=.*[A-Z])|(?=.\d)(?=.[A-Z])
如果您有更多条件,我建议您单独测试条件。对于小案例,你仍然可以列出所有的组合,但当你必须处理更多时,它会变得一团糟。
您实际上可以在 .NET 正则表达式中使用平衡的捕获组来执行此操作...但这在 Java 中不可用。
【参考方案1】:
您需要进行交替以应对所有可能的情况:
((?=.*\d)(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))
查看demo,它也将整个字符串与matches()
匹配:
((?=.*\d)(?=.*[a-z])|^(?=.*\d)(?=.*[A-Z])|^(?=.*[a-z])(?=.*[A-Z])).*
【讨论】:
对于更多的组,这将变得更加复杂。难道没有更短更通用的方式吗? 通用方法是不为此使用正则表达式。正则表达式不是灵丹妙药。当规则变得复杂时,您应该使用常规代码。 谢谢。我已经走上了使用常规代码检查替代方案的路线,但我想确保我没有遗漏一些明显的东西。以上是关于在 Java 正则表达式中匹配 y 个组中的 x 个的主要内容,如果未能解决你的问题,请参考以下文章
Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?