使用反向引用来引用模式而不是实际匹配

时间:2012-03-01 15:53:32

标签: java regex

我正在尝试编写一个匹配(不一定重复)文本块序列的正则表达式,例如:

foo,bar,foo,bar

我最初的想法是使用反向引用,比如

(foo|bar)(,\1)*

但事实证明,此正则表达式仅匹配foo,foobar,bar,但不匹配foo,barbar,foo(依此类推)。

有没有其他方法可以引用模式的一部分?

在现实世界中,foobar是50个字符长的正则表达式,我只是想避免复制粘贴它们来定义序列。

3 个答案:

答案 0 :(得分:3)

具有良好的正则表达式风格,您可以使用(foo|bar)(?:,(?-1))*等。 但Java不支持子模式调用。

所以你最终可以选择在ajx的答案中进行字符串替换/格式化,或者如果你知道它什么时候应该存在,那么你可以调整逗号。例如:

(?:(?:foo|bar)(?:,(?!$|\s)|))+

答案 1 :(得分:1)

也许你可以在Java中逐位构建你的正则表达式,如:

String subRegex = "foo|bar";
String fullRegex = String.format("(%1$s)(,(%1$s))*", subRegex);

可以将第二行分解为函数。该函数将采用子表达式并返回与逗号分隔的子表达式列表匹配的完整正则表达式。

答案 2 :(得分:0)

后引用的要点是匹配匹配的实际文本,而不是模式,所以我不确定你是否可以使用它。

你能使用像:

这样的量词吗?
    String s= "foo,bar,foo,bar";
            String externalPattern = "(foo|bar)"; // comes from somewhere else
            Pattern p = Pattern.compile(externalPattern+","+externalPattern+"*");
    Matcher m = p.matcher(s);
    boolean b = m.find();

将匹配2个或更多foo或bar实例(后跟逗号)