bu yolu
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));
deneyin olmak olsun nasıl Sonra regex kullanarak çıkış olacağını
aaaabbb
ve
aaaaab
aaaabbbaaaaab
olduğunu varsayalım
Bu normal kullanım s look around mekanizmaları ve
b
ile tahmin edilir a
ile a
- başlar ile tahmin edilir
- başlar
b
ile giriş başlangıcında ^
bulunmuyorsa (a+b+|b+a+)
bulacaksınız.
Çıktı:
aaaabbb
bbbaaaaa
aaaaab
^
esasen bu normal ifadede gerekli mi?
Evet
,
^
olmadan bu regex Girdi başlangıcında yer
aaaabbb
yakalamak olmaz. Ben
(?=(a+b+|b+a+))
sonra
(^|(?<=a)b|(?<=b)a)
eklemek olmaz Eğer (ama maçta
b
içermez önce
Bu normal ifadenin
aaaabbb
aaabbb
aabbb
abbb
bbbaaaaa
bbaaaaa
baaaaa
aaaaab
aaaab
aaab
aab
ab
yüzden bu sadece bu
b
sahiptir
a
ile başlar buna sonuçları sınırlamak için gerekli eşleşir - Yani arkasına bakmak için mükemmeldi) ve
a
tarafından tahmin edilen
b
.
Ancak, dizenin başlangıcında yer alan ve hiçbir şey tarafından tahmin edilmeyen a
veya b
'u unutmayalım. Bunları dahil etmek için ^
'u kullanabiliriz.
Belki bu regex
(?=(a+b+|b+a+))((?<=^|a)b|(?<=^|b)a)
ile bu fikri göstermek için daha kolay olacaktır.
(?<=^|a)b
dize başında yerleştirilen ya da
(?<=^|b)a
dize başında yerleştirilen veya sahiptir a
maç olacak önce a
sahiptir b
maç olacak b
o
Bir karakteri reconsume yok koyar. Reg'i istediğiniz gibi eşleştirmek için değiştirmeniz gerekir. – karmanaut
Bu size yardımcı olmalıdır: http://stackoverflow.com/questions/320448/overlapping-matches-in-regex –