【问题标题】:Match x out of y groups in Java regex在 Java 正则表达式中匹配 y 个组中的 x 个
【发布时间】: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 中不可用。

标签: java regex


【解决方案1】:

您需要进行交替以应对所有可能的情况:

((?=.*\d)(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))

查看demo,它也将整个字符串与matches()匹配:

((?=.*\d)(?=.*[a-z])|^(?=.*\d)(?=.*[A-Z])|^(?=.*[a-z])(?=.*[A-Z])).*

【讨论】:

  • 对于更多的组,这将变得更加复杂。难道没有更短更通用的方式吗?
  • 通用方法是不为此使用正则表达式。正则表达式不是灵丹妙药。当规则变得复杂时,您应该使用常规代码。
  • 谢谢。我已经走上了使用常规代码检查替代方案的路线,但我想确保我没有遗漏一些明显的东西。
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
相关资源
最近更新 更多