2

I would like to match some pattern multiple times, exactly like described here.

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

This will match for example:

somelongpattern0
somelongpattern9 ,; somelongpattern2

However above code works in pcre, it does not work not in java. It gives me an error "unclosed options group" on (?1)

Is there any way how to do this? I have a very long regex pattern and i don't want to repeat it 2 times if possible.

Lopfest
  • 103
  • 10

2 Answers2

7

The regex engine in Java does not support subroutines (as in PHP or Ruby).

Thus, you may work around it by defining the repeated subpatterns as separate variables and use them to build the final regex:

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

Or using String.format:

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

See the online demo.

Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563
1

In reviewing the Java documentation they still do not follow the PCRE guidelines for subroutines. Basically Java Regex does not support subroutines.

see also Java Regex Manual

Ro Yo Mi
  • 14,790
  • 5
  • 35
  • 43