provare in questo modo
String data = "aaaabbbaaaaab";
Matcher m = Pattern.compile("(?=(a+b+|b+a+))(^|(?<=a)b|(?<=b)a)").matcher(data);
while(m.find())
System.out.println(m.group(1));
Questo uso regex s look around meccanismi e troverà (a+b+|b+a+)
che
- esiste all'inizio
^
dell'ingresso
- inizia con
b
che è previsto da a
- inizia con
a
che è previsto da b
.
uscita:
aaaabbb
bbbaaaaa
aaaaab
Is ^
essenzialmente necessari in questa espressione regolare?
Sì, senza ^
questa espressione regolare non sarebbe catturare aaaabbb
collocato all'inizio di ingresso.
Se non vorrei aggiungere (^|(?<=a)b|(?<=b)a)
dopo (?=(a+b+|b+a+))
questa regex sarebbe partita
aaaabbb
aaabbb
aabbb
abbb
bbbaaaaa
bbaaaaa
baaaaa
aaaaab
aaaab
aaab
aab
ab
quindi avevo bisogno di limitare questo risulta solo questi che inizia con a
che ha b
prima (ma non includere b
sospesa - Quindi guardare indietro era perfetto per questo) e b
che è previsto da a
.
Ma non dimenticare di a
o b
che sono posizionati all'inizio della stringa e non sono previsti da nulla. Per includerli possiamo usare ^
.
Forse sarà più facile mostrare questa idea con questo regex
(?=(a+b+|b+a+))((?<=^|a)b|(?<=^|b)a)
.
(?<=^|a)b
corrisponderà b
che è posto all'inizio della stringa, o ha a
prima che
(?<=^|b)a
corrisponderà a
che è posto all'inizio della stringa, o ha b
prima che
Non riconsiderare un personaggio. Dovresti modificare il regex in modo che corrisponda come vuoi. – karmanaut
Questo dovrebbe essere in grado di aiutarti: http://stackoverflow.com/questions/320448/overlapping-matches-in-regex –