【问题标题】:Conditional Regular Expression in Java?Java中的条件正则表达式?
【发布时间】:2011-04-10 22:00:05
【问题描述】:

我有一个适用于正则表达式测试网站(例如 regexlib.com)的条件正则表达式,但无法让它在我的 Java 应用程序中运行。

但是,http://www.regular-expressions.info/conditional.html 表示 Java 不支持条件,但我看到其他关于 SO 的帖子暗示它支持。

我的 RegEx 的一个例子是:(?(?=^[0-9])(317866?)|[a-zA-Z0-9]{6}(317866?))

它应该匹配以下任一输入:317866317866A12FCF1CS317866

如何解决这个 Java 限制?

TIA

【问题讨论】:

  • 应该匹配31786吗?如果不是,那? 在最后 6 个之后在做什么?

标签: java regex conditional


【解决方案1】:

不如直接这样做?

(?:[a-zA-Z0-9]{6})?(317866?)

或者,如果您知道较长的版本总是以字母开头,那么您可以使用:

(?:[a-zA-Z][a-zA-Z0-9]{5})?(317866?)

它将首先尝试匹配 6 个字母数字,然后是 31786 或 317866,如果失败,它将回溯并尝试匹配 31786 或 317866。

【讨论】:

  • 感谢您的快速回复...我对 RegEx 并不熟悉,而且我没有意识到它可能这么简单。我的业务规则是:如果以字母开头,则忽略前 6 个,如果以数字开头,则从头开始匹配。所以,第二个例子似乎更完整。
  • @RNeuendorff:第二个例子应该可以工作,它不会匹配123456316866,第一个表达式将匹配。我想你想要第二个例子。
  • @Mark Byers:那个正则表达式并不完全准确。我不想匹配“AB1363183A23”之类的东西,但那个正则表达式可以。
  • @RNeuendorff:你确定吗?您作为示例提供的字符串甚至不包含31786 那么它怎么匹配?​​
  • @RNeuendorff:最好的测试是编写一个简短的 Java 程序来测试它们。只需要大约 3 或 4 行代码。
【解决方案2】:

java.util.regex.Pattern 类不支持条件表达式。 要解决这个问题,您可以使用第 3 方正则表达式库,例如 JRegex

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2019-02-07
    • 2016-09-19
    • 2015-12-29
    • 2011-10-30
    相关资源
    最近更新 更多