【问题标题】:validate regex submatches验证正则表达式子匹配
【发布时间】:2015-02-11 14:36:14
【问题描述】:

我有以下一句话:

  • E012PH345AN678T

和下面的正则表达式:

  • ^E(.*)?(PH(.*)?AN|AN(.*)?PH)(.*)?T$

这将触发以下匹配:

  • 1:012
  • 2:PH345AN
  • 3:345
  • 4:
  • 5:678

有什么方法可以确保子匹配 (1,3,4,5) 在同一个正则表达式 (a-la (\1\3\4\5)\d{3,}) 中至少包含 3 位数字?正则表达式将在我无法控制太多的 Java 环境中运行。

更新 - 作为一个额外的例子,这个EXY2PHZ45ANUWT 也应该匹配......我只需要在全局级别的匹配中找到2,4,5。数字只是我需要的一个简化示例......可以是字母或其他东西。

谢谢。

【问题讨论】:

标签: java regex match


【解决方案1】:

您可以使用这个基于前瞻的正则表达式:

^(?=(\D*\d){3})E(.*?)(PH(.*?)AN|AN(.*?)PH)(.*?)T$

(?=\d{3}) 是一个前瞻,确保您的输入中至少有 3 位数字。

在 Java 中:

^(?=(\\D*\\d){3})E(.*?)(PH(.*?)AN|AN(.*?)PH)(.*?)T$

RegEx Demo

【讨论】:

  • \d{3} 将完全匹配 3 位数字。要拥有 3 个或更多,请改用 \d{3,}。
  • @mazaneicha:不,同样的正则表达式也会匹配E01234PH345AN678T(?=\d{3}) 是为了确保至少有 3 个数字,也可以有超过 3 个。
  • 我希望在全球范围内至少有 3 位数字。不是每个匹配都有 3 位数字。我已经更新了帖子。 EXY2PHZ45ANUWT 也应该是匹配的......
【解决方案2】:

修改你的正则表达式为

^(?=.*\d.*\d.*\d.*)E(.*)?(PH(.*)?AN|AN(.*)?PH)(.*)?T$

这将匹配输入当且仅当它具有至少三个数字,无论它们被捕获在哪个子组中。

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多