2012-01-19 11 views
9

devo codice successivo:non avidi Regular Expression in Java

public static void createTokens(){ 
    String test = "test is a word word word word big small"; 
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+?\\s*)").matcher(test); 
    while (mtch.find()){ 
     for (int i = 1; i <= mtch.groupCount(); i++){ 
      System.out.println(mtch.group(i)); 
     } 
    } 
} 

E avere in uscita il prossimo:

word 
w 

Ma a mio parere deve essere:

word 
word 

Somebody per favore spiegami perché così?

risposta

10

Poiché i tuoi schemi non sono golosi, hanno abbinato il meno testo possibile mentre sono ancora costituiti da una corrispondenza.

Rimuovere il? nel secondo gruppo, e si otterrà parola
parola
parola piccola grande

Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+\\s*)").matcher(test); 
+0

E ora il secondo gruppo sta catturando troppo invece che troppo poco. La non avidità non è il problema, e l'avidità non è la soluzione. –

+1

Hai ragione, ma IMHO, la non-golosità del secondo gruppo che cattura spiega perché cattura semplicemente "w". Il primo gruppo che cattura deve catturare "parola" a causa della "parola" letterale che la segue. Non so esattamente cosa stia cercando e ha modificato la domanda dopo aver inviato la mia risposta, quindi non posso fornire un'espressione regolare corretta. – theglauber

3

Utilizzando \\s* che corrisponderà a qualsiasi numero di spazi tra cui 0 spazi. w corrisponde a (\\s*.+?\\s*). Per assicurarti che corrisponda a una parola separata da spazi prova (\\s+.+?\\s+)

+0

Il problema è che la regex sta già consumando i caratteri dello spazio prima e dopo la parola, quindi ora stai cercando di consumarli due volte. –

+0

Tutto quello che dovresti fare è rimuovere lo spazio dalla regex come ... '\\ s +) word (\\ s +' ... –

Problemi correlati