在 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 个的主要内容,如果未能解决你的问题,请参考以下文章

最多匹配 n 个字符

正则表达式中 如何取出所有组中的值?

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

java中使用正则表达式来匹配(1/2),正则表达式怎么写?

Python:在元组中存储许多正则表达式匹配?

正则表达式匹配模式 x 但返回任意字符串 y