简化正则表达式“ab | a | b”

时间:2013-04-25 14:24:30

标签: regex redundancy simplify

(如何)可以简化以下正则表达式:

ab|a|b

我正在寻找一个不那么冗余的,即只有一个a和一个b。有可能吗?

有些尝试:

a?b?       # matches empty string while shouldn't
ab?|b      # still two b

请注意,真正的正则表达式有更复杂的ab部分,即不是单个字符,但内部子规则可以说。

1 个答案:

答案 0 :(得分:6)

如果您使用Perl或某些PCRE引擎(如PHP的preg_函数),您可以参考模式中的先前组,如下所示:

/(a)(b)|(?1)|(?2)/

此功能的主要目的是支持递归,但它也可用于模式重用。

请注意,在这种情况下,您无法在第一次轮换中绕过捕获ab,这会产生一些(可能)不必要的开销。为避免这种情况,您可以在从不执行的条件内定义组。执行此操作的规范方法是使用(?(DEFINE)...)组(检查命名的DEFINE组是否与任何内容匹配,但当然该组不存在):

/(?(DEFINE)(a)(b))(?1)(?2)|(?1)|(?2)/

如果您的引擎不支持(编辑:,因为您使用的是Java,不支持此功能),您可以在单一模式中获得最佳效果

ab?|b

或者,您可以通过字符串连接/格式化手动构建ab|a|b版本,如:

String a = "a";
String b = "b";
String pattern = a + b + "|" + a + "|" + b;

这也避免了重复。或者,您可以对主题字符串使用3个单独的模式abab(其中第一个模式再次是后两者的串联)。