2011-11-11 16 views
12
void menu() { 
    print(); 
    Scanner input = new Scanner(System.in); 
    while(true) { 
     String s = input.next(); 
     switch (s) { 
     case "m": print(); continue; 
     case "s": stat(); break; 
     case "[A-Z]{1}[a-z]{2}\\d{1,}": filminfo(s); break; 
     case "Jur1": filminfo(s); break; //For debugging - this worked fine 
     case "q": ; return; 
     } 
    } 
} 

Sembra che la mia regex sia disattivata o che non la sto usando correttamente nella dichiarazione del caso. Quello che voglio è una stringa che: inizi con esattamente una lettera maiuscola ed è seguita esattamente da due lettere minuscole, che sono seguite da almeno una cifra.Utilizzo di espressioni regolari per l'istruzione switch in Java

Ho controllato l'API di regex e ho provato le tre varianti (quantificatori avidi, riluttanti e possessivi) senza conoscere il loro corretto utilizzo. Controllato anche i metodi per String senza trovare un metodo che sembrava pertinente alle mie esigenze.

+2

È qualcosa di nuovo in Java 7? passare con regex. Non esiste una cosa simile in Java 6 o meno. – gigadot

+1

non c'è nemmeno un interruttore di stringa in 6 e in basso (solo integrali ed enumerazioni) –

+0

Sì - sospettavo che ciò stesse infrangendo le regole dell'interruttore. Quindi oltre alle buone 'ol se/else if-statement allora? – jollyroger

risposta

23

Non è possibile utilizzare un regex come caso di interruttore. (Pensateci: come saprebbe Java se voleste abbinare la stringa "[A-Z]{1}[a-z]{2}\\d{1,}" o la regex?)

Quello che potreste fare, in questo caso, è cercare di far corrispondere la regex nel vostro caso predefinito.

switch (s) { 
     case "m": print(); continue; 
     case "s": stat(); break; 
     case "q": return; 
     default: 
      if (s.matches("[A-Z]{1}[a-z]{2}\\d{1,}")) { 
       filminfo(s); 
      } 
      break; 
    } 

(BTW, questo funziona solo con Java 7 e versioni successive. Non c'è nessuna commutazione sulle stringhe prima di questo.)

+0

Impressionante modo di gestire il caso :) –

4

non credo che è possibile utilizzare espressioni regolari in caso di commutazione.

la stringa nella espressione switch viene confrontato con le espressioni associato a ciascuna etichetta case come se fosse utilizzato il metodo String.equals.

Vedere http://download.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html per ulteriori informazioni.

+0

Grazie per aver approfondito la mia comprensione delle dichiarazioni di commutazione. – jollyroger

Problemi correlati