正则表达式重用模式来捕获多个组?

时间:2017-09-28 10:11:39

标签: java regex

我想多次匹配一些模式,完全像描述here

^(somelongpattern[0-9])([,; ]+(?1))*$

这将匹配例如:

somelongpattern0
somelongpattern9 ,; somelongpattern2

但是上面的代码在pcre中工作,它在java中不起作用。它给了我一个错误"未关闭的选项组"在(?1)

有什么方法可以做到这一点吗?我有一个非常长的正则表达式模式,如果可能,我不想重复它2次。

2 个答案:

答案 0 :(得分:2)

Java中的正则表达式引擎不支持subroutines(如在PHP或Ruby中)。

因此,您可以通过将重复的子模式定义为单独的变量并使用它们来构建最终的正则表达式来解决它:

String block = "somelongpattern[0-9]";
String final_regex = "^(" + block + ")([,; ]+" + block + ")*$";

或使用String.format

String block = "somelongpattern[0-9]";
String final_regex = String.format("^(%1$s)([,; ]+%1$s)*$",block);

请参阅online demo

答案 1 :(得分:0)

在查看Java文档时,他们仍然不遵循子程序的PCRE指南。基本上Java Regex不支持子例程。

另见Java Regex Manual