(如何)可以在下面的正则表达式被简化:
ab|a|b
?
我在找一个不太冗余之一,即只有一个a
和一个b
。 可能吗?
一些尝试:
a?b? # matches empty string while shouldn't
ab?|b # still two b
需要注意的是真正的正则表达式有更复杂的a
和b
部分,即不是单个字符,但内subregexes让我们说。
(如何)可以在下面的正则表达式被简化:
ab|a|b
?
我在找一个不太冗余之一,即只有一个a
和一个b
。 可能吗?
一些尝试:
a?b? # matches empty string while shouldn't
ab?|b # still two b
需要注意的是真正的正则表达式有更复杂的a
和b
部分,即不是单个字符,但内subregexes让我们说。
如果你正在使用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
针对目标字符串(其中第一个又是后两者的串联)。