2011-07-28 21 views
23

Sto cercando di catturare la parte destra dopo: usando java expr, ma nel codice seguente, il gruppo di cattura stampato è l'intera stringa, cosa c'è che non va?java regex capture group

String s ="xyz: 123a-45"; 
String patternStr="xyz:[ \\t]*([\\S ]+)"; 
Pattern p = Pattern.compile(patternStr); 
Matcher m = p.matcher(s); 
//System.err.println(s); 
if(m.find()){ 
    int count = m.groupCount(); 
    System.out.println("group count is "+count); 
    for(int i=0;i<count;i++){ 
     System.out.println(m.group(i)); 
    } 
} 

risposta

29

La numerazione dei sottogruppi inizia con 1, 0 è il testo completo. Basta andare fino a contare + 1 con il tuo loop.

+8

Più precisamente, modificare la condizione di ciclo 'for' su' i <= count'. –

1

Questo perché gli indici di gruppo iniziano con 1. Il gruppo 0 è l'intero modello.

Dalla JavaDoc: "gruppi di cattura sono indicizzati da sinistra a destra, a partire da un gruppo di zero indica l'intero modello, quindi l'espressione m.group (0) è equivalente a m.group().". Vedi altro here

+0

Penso che la confusione su questo deriva dal fatto che il documento ha confuso "indicizzazione" (sempre da 0) con "numerazione" (da qualsiasi valore che ti piace). –