(如何)可以简化以下正则表达式:
ab|a|b
我正在寻找一个不那么冗余的,即只有一个a
和一个b
。有可能吗?
有些尝试:
a?b? # matches empty string while shouldn't
ab?|b # still two b
请注意,真正的正则表达式有更复杂的a
和b
部分,即不是单个字符,但内部子规则可以说。
答案 0 :(得分:6)
如果您使用Perl或某些PCRE引擎(如PHP的preg_
函数),您可以参考模式中的先前组,如下所示:
/(a)(b)|(?1)|(?2)/
此功能的主要目的是支持递归,但它也可用于模式重用。
请注意,在这种情况下,您无法在第一次轮换中绕过捕获a
和b
,这会产生一些(可能)不必要的开销。为避免这种情况,您可以在从不执行的条件内定义组。执行此操作的规范方法是使用(?(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个单独的模式ab
,a
和b
(其中第一个模式再次是后两者的串联)。