2013-03-31 26 views
5

Kaynağın tüketilen karakterini desen eşleştirmesinde yeniden kullanmanın bir yolu var mı? Örneğin, bir regex ifadesi (a+b+|b+a+) ile bir model bulmak istediğimi varsayalım, yani birden fazla a, ardından birden fazla b VEYA tam tersi. Java regex: Tüketilen karakteri desen eşleştirmede nasıl yeniden kullanılır?

giriş Ben çıkış

aaaabbb 
bbbaaaaa 
aaaaab 
+0

Bir karakteri reconsume yok koyar. Reg'i istediğiniz gibi eşleştirmek için değiştirmeniz gerekir. – karmanaut

+0

Bu size yardımcı olmalıdır: http://stackoverflow.com/questions/320448/overlapping-matches-in-regex –

cevap

6

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
+0

You çok fazla :) ederiz. Onun gerçekten açık bir cevabı. Regex arkadaşına bir göz attım, ama yine de bazı karışıklıklar var çünkü ben regex için gerçekten yeniyim. Regex ifadesinde,^'nin ne anlama geldiğini biraz daha açıklayabilir misiniz? Büyük cevap :) için tekrar teşekkür ederiz. – dshgna

+0

@dgun '^' (http://www.regular-expressions.info/anchors.html) String başlayan maçlar [çapa] 'dir. – Pshemo

+0

Bu normal ifadede^esasen gerekli mi? Neden? (bu aptalca eğer Üzgünüm, sadece merak ediyorum :)) – dshgna

3

You önce Bu benzetim ile simüle edebilir:

((?<=a)b+|(?<=b)a+) 

This out

bbb aaaaa b