简化正则表达式“AB | A | B”(Simplifying the regex “ab|a|b”

2019-09-01 03:24发布

(如何)可以在下面的正则表达式被简化:

ab|a|b

我在找一个不太冗余之一,即只有一个a和一个b 。 可能吗?

一些尝试:

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

需要注意的是真正的正则表达式有更复杂的ab部分,即不是单个字符,但内subregexes让我们说。

Answer 1:

如果你正在使用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针对目标字符串(其中第一个又是后两者的串联)。



文章来源: Simplifying the regex “ab|a|b”