import java.util.regex.*;
import java.util.ArrayList;
public class Main {
private static Pattern combineRe(Pattern p1, Pattern p2){
return Pattern.compile(combineRE(p1.pattern(), p2.pattern()));
}
return combineRE(p1, p2, true);
}
int groups1 = 0, groups2=0;
StringBuilder newP = new StringBuilder((anchors)?"^(?=":"(?=");
newP.append(p1);
if (anchors) newP.append('$');
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);
if (anchors) newP.append('$');
newP.append(')');
if (anchors) newP.append(".*");
return newP.toString();
}
ArrayList<String> toReturn = new ArrayList<String>();
Pattern pCombo = Pattern.compile(combineRE(p1,p2, false));
String pComboMatch
= combineRE
(p1,p2,
true); Matcher m = pCombo.matcher(haystack);
int s = 0;
while (m.find(s)){
s = m.start()+1;
String match
= haystack.
substring(m.
start()); for (int i=match.length(); i>0; i--){
String sMatch
= match.
substring(0,i
); if (Pattern.matches(pComboMatch, sMatch)){
toReturn.add(sMatch);
if (!overlap){
s = m.start()+i;
break;
}
}
}
}
return toReturn.
toArray(new String[]{});
}
public static void main
(String[] args
){ System.
out.
println("p1: " + p1
+ "\np2: " + p2
+ "\np: " + p
+ "\ns: " + s
); Matcher m = Pattern.compile(p).matcher(s);
m = Pattern.compile("(?=4)").matcher("01234567890123456");
String[] noverlap
= findAllCombinedRE
(p1, p2, s,
false); for (int i=0; i<noverlap.length; i++){
System.
out.
println(noverlap
[i
]); }
String[] overlap
= findAllCombinedRE
(p1, p2, s,
true); for (int i=0; i<overlap.length; i++){
System.
out.
println(overlap
[i
]); }
}
}
aW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKCnB1YmxpYyBjbGFzcyBNYWluIHsKICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gY29tYmluZVJlKFBhdHRlcm4gcDEsIFBhdHRlcm4gcDIpewogICAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUoY29tYmluZVJFKHAxLnBhdHRlcm4oKSwgcDIucGF0dGVybigpKSk7CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29tYmluZVJFKFN0cmluZyBwMSwgU3RyaW5nIHAyKXsKICAgICAgICByZXR1cm4gY29tYmluZVJFKHAxLCBwMiwgdHJ1ZSk7CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29tYmluZVJFKFN0cmluZyBwMSwgU3RyaW5nIHAyLCBib29sZWFuIGFuY2hvcnMpewogICAgICAgIGludCBncm91cHMxID0gMCwgZ3JvdXBzMj0wOwogICAgICAgIFN0cmluZ0J1aWxkZXIgbmV3UCA9IG5ldyBTdHJpbmdCdWlsZGVyKChhbmNob3JzKT8iXig/PSI6Iig/PSIpOwogICAgICAgIG5ld1AuYXBwZW5kKHAxKTsKICAgICAgICBpZiAoYW5jaG9ycykgbmV3UC5hcHBlbmQoJyQnKTsKICAgICAgICBuZXdQLmFwcGVuZCgiKSg/PSIpOwogICAgICAgIAogICAgICAgIFBhdHRlcm4gY2FwdHVyaW5nR3JvdXAgPSBQYXR0ZXJuLmNvbXBpbGUoIig/PCFcXFxcKShcXFxcXFxcXCkqXFwoKD8hXFw/KSIpOwogICAgICAgIE1hdGNoZXIgbSA9IGNhcHR1cmluZ0dyb3VwLm1hdGNoZXIocDEpOwogICAgICAgIHdoaWxlKG0uZmluZCgpKSBncm91cHMxICsrOwogICAgICAgIAogICAgICAgIG0gPSBjYXB0dXJpbmdHcm91cC5tYXRjaGVyKHAyKTsKICAgICAgICAKICAgICAgICB3aGlsZShtLmZpbmQoKSkgZ3JvdXBzMiArKzsKICAgICAgICBTdHJpbmcgbmV3MiA9IHAyOwogICAgICAgIAogICAgICAgIGZvcihpbnQgaT0xOyBpPD1ncm91cHMyOyBpKyspCiAgICAgICAgICAgIG5ldzIgPSBuZXcyLnJlcGxhY2VBbGwoIig/PCFcXFxcKVxcXFwiK2ksICJcXFxcIiArIChpK2dyb3VwczEpKTsKICAgICAgICAgICAgICAgIAogICAgICAgIG5ld1AuYXBwZW5kKG5ldzIpOwogICAgICAgIGlmIChhbmNob3JzKSBuZXdQLmFwcGVuZCgnJCcpOwogICAgICAgIG5ld1AuYXBwZW5kKCcpJyk7CiAgICAgICAgaWYgKGFuY2hvcnMpIG5ld1AuYXBwZW5kKCIuKiIpOwogICAgICAgIHJldHVybiBuZXdQLnRvU3RyaW5nKCk7CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmaW5kQWxsQ29tYmluZWRSRShTdHJpbmcgcDEsIFN0cmluZyBwMiwgU3RyaW5nIGhheXN0YWNrLCBib29sZWFuIG92ZXJsYXApewogICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHRvUmV0dXJuID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgUGF0dGVybiBwQ29tYm8gPSBQYXR0ZXJuLmNvbXBpbGUoY29tYmluZVJFKHAxLHAyLCBmYWxzZSkpOwogICAgICAgIFN0cmluZyBwQ29tYm9NYXRjaCA9IGNvbWJpbmVSRShwMSxwMiwgdHJ1ZSk7CiAgICAgICAgTWF0Y2hlciBtID0gcENvbWJvLm1hdGNoZXIoaGF5c3RhY2spOwogICAgICAgIGludCBzID0gMDsKICAgICAgICB3aGlsZSAobS5maW5kKHMpKXsKICAgICAgICAgICAgcyA9IG0uc3RhcnQoKSsxOwogICAgICAgICAgICBTdHJpbmcgbWF0Y2ggPSBoYXlzdGFjay5zdWJzdHJpbmcobS5zdGFydCgpKTsKICAgICAgICAgICAgZm9yIChpbnQgaT1tYXRjaC5sZW5ndGgoKTsgaT4wOyBpLS0pewogICAgICAgICAgICAgICAgU3RyaW5nIHNNYXRjaCA9IG1hdGNoLnN1YnN0cmluZygwLGkpOwogICAgICAgICAgICAgICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhwQ29tYm9NYXRjaCwgc01hdGNoKSl7CiAgICAgICAgICAgICAgICAgICAgdG9SZXR1cm4uYWRkKHNNYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvdmVybGFwKXsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG0uc3RhcnQoKStpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRvUmV0dXJuLnRvQXJyYXkobmV3IFN0cmluZ1tde30pOwogICAgICAgIAogICAgfQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CiAgICAgICAgU3RyaW5nIHAxID0gImEuKiI7CiAgICAgICAgU3RyaW5nIHAyID0gIi4qYiI7CiAgICAgICAgU3RyaW5nIHAgPSBjb21iaW5lUkUocDEsIHAyKTsKICAgICAgICBTdHJpbmcgcyA9ICJjYWFiY2JjIjsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInAxOiAiICsgcDEgKyAiXG5wMjogIiArIHAyICsgIlxucDogIiArIHAgKyAiXG5zOiAiICsgcyk7CiAgICAgICAgTWF0Y2hlciBtID0gUGF0dGVybi5jb21waWxlKHApLm1hdGNoZXIocyk7CiAgICAgICAgbSA9IFBhdHRlcm4uY29tcGlsZSgiKD89NCkiKS5tYXRjaGVyKCIwMTIzNDU2Nzg5MDEyMzQ1NiIpOwogICAgICAgIFN0cmluZ1tdIG5vdmVybGFwID0gZmluZEFsbENvbWJpbmVkUkUocDEsIHAyLCBzLCBmYWxzZSk7CiAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vdmVybGFwLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihub3ZlcmxhcFtpXSk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIFN0cmluZ1tdIG92ZXJsYXAgPSBmaW5kQWxsQ29tYmluZWRSRShwMSwgcDIsIHMsIHRydWUpOwogICAgICAgIGZvciAoaW50IGk9MDsgaTxvdmVybGFwLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvdmVybGFwW2ldKTsKICAgICAgICB9CiAgICB9Cn0=