import java.util.regex.* ;
public class Main {
private static Pattern combineRe( Pattern p1, Pattern p2) {
return Pattern.compile ( combineRE( p1.pattern ( ) , p2.pattern ( ) ) ) ;
}
int groups1 = 0 , groups2= 0 ;
StringBuilder newP = new StringBuilder( "(?=" ) ;
newP.append ( p1) ;
newP.append ( "$)(?=" ) ;
Pattern capturingGroup = Pattern.compile ( "(?<!\\ \\ )(\\ \\ \\ \\ )*\\ ((?!\\ ?)" ) ;
Matcher m = capturingGroup.matcher ( p1) ;
while ( m.find ( ) ) groups1 ++;
m = capturingGroup.matcher ( p2) ;
while ( m.find ( ) ) groups2 ++;
for ( int i= 1 ; i<= groups2; i++ )
new2 = new2.replaceAll ( "(?<!\\ \\ )\\ \\ " + i, "\\ \\ " + ( i+ groups1) ) ;
newP.append ( new2) ;
newP.append ( "$).*" ) ;
return newP.toString ( ) ;
}
public static void main
( String [ ] args
) { reComboTestCase[ ] cases = {
new reComboTestCase(
"(?=.*)([ab])\\ 1"
, "([c]*)\\ 1bb"
)
, new reComboTestCase(
"a."
, ".b"
)
} ;
for ( int i= 0 ; i< cases.length ; i++ )
cases[ i] .test ( i) ;
}
private static class reComboTestCase{
String [ ] left
; //Strings that should match p1 but not p2 String [ ] right
; //Strings that should match p2 but not p1 String [ ] intersect
; //Strings that should match both this .p1 = p1;
this .p2 = p2;
this .left = left;
this .right = right;
this .intersect = intersect;
}
public void test( int n) {
System .
out .
printf ( "TEST %d:\n " , n
) ; System .
out .
printf ( "\t P1: %s\n " , p1
) ; System .
out .
printf ( "\t P2: %s\n " , p2
) ; String combo
= Main.
combineRE ( p1,p2
) ; System .
out .
printf ( "\t Combo: %s\n " , combo
) ; Pattern one = Pattern.compile ( p1) ;
Pattern two = Pattern.compile ( p2) ;
Pattern three = Pattern.compile ( combo) ;
System .
out .
printf ( "\t %100s: %5s %5s %5s\n " ,
"LEFT" ,
"ONE" ,
"TWO" ,
"COMBO" ) ; for ( int i= 0 ; i< left.length ; i++ )
System .
out .
printf ( "\t %100s: %5s %5s %5s\n " , left[ i]
, one.matcher ( left[ i] ) .matches ( )
, two.matcher ( left[ i] ) .matches ( )
, three.matcher ( left[ i] ) .matches ( )
) ;
System .
out .
printf ( "\t %100s: %5s %5s %5s\n " ,
"RIGHT" ,
"ONE" ,
"TWO" ,
"COMBO" ) ; for ( int i= 0 ; i< right.length ; i++ )
System .
out .
printf ( "\t %100s: %5s %5s %5s\n " , left[ i]
, one.matcher ( right[ i] ) .matches ( )
, two.matcher ( right[ i] ) .matches ( )
, three.matcher ( right[ i] ) .matches ( )
) ;
System .
out .
printf ( "\t %100s: %5s %5s %5s\n " ,
"INTERSECT" ,
"ONE" ,
"TWO" ,
"COMBO" ) ; for ( int i= 0 ; i< intersect.length ; i++ )
System .
out .
printf ( "\t %100s: %5s %5s %5s\n " , left[ i]
, one.matcher ( intersect[ i] ) .matches ( )
, two.matcher ( intersect[ i] ) .matches ( )
, three.matcher ( intersect[ i] ) .matches ( )
) ;
}
}
}
aW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBjb21iaW5lUmUoUGF0dGVybiBwMSwgUGF0dGVybiBwMil7CiAgICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZShjb21iaW5lUkUocDEucGF0dGVybigpLCBwMi5wYXR0ZXJuKCkpKTsKICAgIH0KICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb21iaW5lUkUoU3RyaW5nIHAxLCBTdHJpbmcgcDIpewogICAgICAgIGludCBncm91cHMxID0gMCwgZ3JvdXBzMj0wOwogICAgICAgIFN0cmluZ0J1aWxkZXIgbmV3UCA9IG5ldyBTdHJpbmdCdWlsZGVyKCIoPz0iKTsKICAgICAgICBuZXdQLmFwcGVuZChwMSk7CiAgICAgICAgbmV3UC5hcHBlbmQoIiQpKD89Iik7CiAgICAgICAgCiAgICAgICAgUGF0dGVybiBjYXB0dXJpbmdHcm91cCA9IFBhdHRlcm4uY29tcGlsZSgiKD88IVxcXFwpKFxcXFxcXFxcKSpcXCgoPyFcXD8pIik7CiAgICAgICAgTWF0Y2hlciBtID0gY2FwdHVyaW5nR3JvdXAubWF0Y2hlcihwMSk7CiAgICAgICAgd2hpbGUobS5maW5kKCkpIGdyb3VwczEgKys7CiAgICAgICAgCiAgICAgICAgbSA9IGNhcHR1cmluZ0dyb3VwLm1hdGNoZXIocDIpOwogICAgICAgIAogICAgICAgIHdoaWxlKG0uZmluZCgpKSBncm91cHMyICsrOwogICAgICAgIFN0cmluZyBuZXcyID0gcDI7CiAgICAgICAgCiAgICAgICAgZm9yKGludCBpPTE7IGk8PWdyb3VwczI7IGkrKykKICAgICAgICAgICAgbmV3MiA9IG5ldzIucmVwbGFjZUFsbCgiKD88IVxcXFwpXFxcXCIraSwgIlxcXFwiICsgKGkrZ3JvdXBzMSkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgbmV3UC5hcHBlbmQobmV3Mik7CiAgICAgICAgbmV3UC5hcHBlbmQoIiQpLioiKTsKICAgICAgICByZXR1cm4gbmV3UC50b1N0cmluZygpOwogICAgfQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CiAgICAgICAgcmVDb21ib1Rlc3RDYXNlW10gY2FzZXMgPSB7CiAgICAgICAgICAgIG5ldyByZUNvbWJvVGVzdENhc2UoCiAgICAgICAgICAgICAgICAiKD89LiopKFthYl0pXFwxIgogICAgICAgICAgICAgICAgLCAiKFtjXSopXFwxYmIiCiAgICAgICAgICAgICAgICAsIG5ldyBTdHJpbmdbXSB7ICJhYSIgfQogICAgICAgICAgICAgICAgLCBuZXcgU3RyaW5nW10geyAiY2NjY2JiIiB9CiAgICAgICAgICAgICAgICAsIG5ldyBTdHJpbmdbXSB7ICJiYiIgfQogICAgICAgICAgICApCiAgICAgICAgICAgICwgbmV3IHJlQ29tYm9UZXN0Q2FzZSgKICAgICAgICAgICAgICAgICJhLiIKICAgICAgICAgICAgICAgICwgIi5iIgogICAgICAgICAgICAgICAgLCBuZXcgU3RyaW5nW10geyAiYWEiLCAiYWMiIH0KICAgICAgICAgICAgICAgICwgbmV3IFN0cmluZ1tdIHsgImJiIiwgImNiIn0KICAgICAgICAgICAgICAgICwgbmV3IFN0cmluZ1tdIHsgImFiIiB9CiAgICAgICAgICAgICkKICAgICAgICB9OwogICAgICAgIAogICAgICAgIGZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgY2FzZXNbaV0udGVzdChpKTsKICAgIH0KICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHJlQ29tYm9UZXN0Q2FzZXsKICAgICAgICBTdHJpbmcgcDE7CiAgICAgICAgU3RyaW5nIHAyOwogICAgICAgIFN0cmluZ1tdIGxlZnQ7IC8vU3RyaW5ncyB0aGF0IHNob3VsZCBtYXRjaCBwMSBidXQgbm90IHAyCiAgICAgICAgU3RyaW5nW10gcmlnaHQ7IC8vU3RyaW5ncyB0aGF0IHNob3VsZCBtYXRjaCBwMiBidXQgbm90IHAxCiAgICAgICAgU3RyaW5nW10gaW50ZXJzZWN0OyAvL1N0cmluZ3MgdGhhdCBzaG91bGQgbWF0Y2ggYm90aAogICAgICAgIHB1YmxpYyByZUNvbWJvVGVzdENhc2UoU3RyaW5nIHAxLCBTdHJpbmcgcDIsIFN0cmluZ1tdIGxlZnQsIFN0cmluZ1tdIHJpZ2h0LCBTdHJpbmdbXSBpbnRlcnNlY3QpIHsKICAgICAgICAgICAgdGhpcy5wMSA9IHAxOwogICAgICAgICAgICB0aGlzLnAyID0gcDI7CiAgICAgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CiAgICAgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDsKICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3QgPSBpbnRlcnNlY3Q7CiAgICAgICAgfQogICAgICAgIHB1YmxpYyB2b2lkIHRlc3QoaW50IG4pewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiVEVTVCAlZDpcbiIsIG4pOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXHQgICBQMTogJXNcbiIsIHAxKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlx0ICAgUDI6ICVzXG4iLCBwMik7CiAgICAgICAgICAgIFN0cmluZyBjb21ibyA9IE1haW4uY29tYmluZVJFKHAxLHAyKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlx0Q29tYm86ICVzXG4iLCBjb21ibyk7CiAgICAgICAgICAgIFBhdHRlcm4gb25lID0gUGF0dGVybi5jb21waWxlKHAxKTsKICAgICAgICAgICAgUGF0dGVybiB0d28gPSBQYXR0ZXJuLmNvbXBpbGUocDIpOwogICAgICAgICAgICBQYXR0ZXJuIHRocmVlID0gUGF0dGVybi5jb21waWxlKGNvbWJvKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlx0JTEwMHM6ICU1cyAlNXMgJTVzXG4iLCAiTEVGVCIsICJPTkUiLCAiVFdPIiwgIkNPTUJPIik7CiAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPGxlZnQubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXHQlMTAwczogJTVzICU1cyAlNXNcbiIKICAgICAgICAgICAgICAgICAgICAsIGxlZnRbaV0KICAgICAgICAgICAgICAgICAgICAsIG9uZS5tYXRjaGVyKGxlZnRbaV0pLm1hdGNoZXMoKQogICAgICAgICAgICAgICAgICAgICwgdHdvLm1hdGNoZXIobGVmdFtpXSkubWF0Y2hlcygpCiAgICAgICAgICAgICAgICAgICAgLCB0aHJlZS5tYXRjaGVyKGxlZnRbaV0pLm1hdGNoZXMoKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlx0JTEwMHM6ICU1cyAlNXMgJTVzXG4iLCAiUklHSFQiLCAiT05FIiwgIlRXTyIsICJDT01CTyIpOwogICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxyaWdodC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJcdCUxMDBzOiAlNXMgJTVzICU1c1xuIgogICAgICAgICAgICAgICAgICAgICwgbGVmdFtpXQogICAgICAgICAgICAgICAgICAgICwgb25lLm1hdGNoZXIocmlnaHRbaV0pLm1hdGNoZXMoKQogICAgICAgICAgICAgICAgICAgICwgdHdvLm1hdGNoZXIocmlnaHRbaV0pLm1hdGNoZXMoKQogICAgICAgICAgICAgICAgICAgICwgdGhyZWUubWF0Y2hlcihyaWdodFtpXSkubWF0Y2hlcygpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXHQlMTAwczogJTVzICU1cyAlNXNcbiIsICJJTlRFUlNFQ1QiLCAiT05FIiwgIlRXTyIsICJDT01CTyIpOwogICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxpbnRlcnNlY3QubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXHQlMTAwczogJTVzICU1cyAlNXNcbiIKICAgICAgICAgICAgICAgICAgICAsIGxlZnRbaV0KICAgICAgICAgICAgICAgICAgICAsIG9uZS5tYXRjaGVyKGludGVyc2VjdFtpXSkubWF0Y2hlcygpCiAgICAgICAgICAgICAgICAgICAgLCB0d28ubWF0Y2hlcihpbnRlcnNlY3RbaV0pLm1hdGNoZXMoKQogICAgICAgICAgICAgICAgICAgICwgdGhyZWUubWF0Y2hlcihpbnRlcnNlY3RbaV0pLm1hdGNoZXMoKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQp9