2013-03-31 7 views
5

Esiste un modo per riutilizzare un carattere consumato dell'origine nella corrispondenza del modello?Espressione regolare Java: come riutilizzare un carattere consumato nella corrispondenza del modello?

Ad esempio, supponiamo voglio trovare un modello con espressione regex (a+b+|b+a+) cioè più a seguito da più di un B o viceversa.

Supponiamo che l'ingresso è aaaabbbaaaaab

Poi l'output utilizzando regex sarebbe aaaabbb e aaaaab

Come posso ottenere l'uscita di essere

aaaabbb 
bbbaaaaa 
aaaaab 
+0

Non riconsiderare un personaggio. Dovresti modificare il regex in modo che corrisponda come vuoi. – karmanaut

+0

Questo dovrebbe essere in grado di aiutarti: http://stackoverflow.com/questions/320448/overlapping-matches-in-regex –

risposta

6

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

Grazie mille :). È una risposta davvero chiara. Ho dato un'occhiata a regex buddy, ma ho ancora delle confusioni perché sono davvero nuovo di regex. Nell'espressione regex potresti per favore spiegare ulteriormente un po 'di cosa significa? Grazie ancora per l'ottima risposta :). – dshgna

+0

@dgun '^' è [ancora] (http://www.regular-expressions.info/anchors.html) che corrisponde all'inizio di String. – Pshemo

+0

È essenzialmente necessario in questa espressione regolare? Perché? (Scusa se è stupido, sono solo curioso :)) – dshgna

3

È può simulare questo con lookbehind:

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

Questo fuori mette

bbb aaaaa b 
Problemi correlati