繁体   English   中英

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

[英]Using backreference to refer to a pattern rather than actual match

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

foo,bar,foo,bar

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

(foo|bar)(,\\1)*

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

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

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

有了正常的正则表达式,你可以使用(foo|bar)(?:,(?-1))*等。 但Java不支持子模式调用。

因此,您最终可以选择在ajx的答案中执行字符串替换/格式化,或者如果您知道它何时应该存在且何时不存在,则可以调整逗号。 例如:

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

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

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

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

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

你可以使用如下的量词:

    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实例(后跟逗号)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM