2012-04-22 11 views
6

mi riferisco al test harness elencati qui http://docs.oracle.com/javase/tutorial/essential/regex/test_harness.htmlequivalenza Canonical nel modello

L'unico cambiamento che ho fatto per la classe è che il modello è stato creato come di seguito:

Pattern pattern = 
     Pattern.compile(console.readLine("%nEnter your regex(Pattern.CANON_EQ set): "),Pattern.CANON_EQ); 

Come il tutorial a http://docs.oracle.com/javase/tutorial/essential/regex/pattern.html suggerisce di inserire il modello o regex come a\u030A e stringa corrispondente a \u00E5 ma termina con Nessuna corrispondenza trovata. Ho visto entrambe le stringhe una piccola "a" con un anello in cima.

Non ho capito correttamente il caso d'uso?

risposta

7

Il comportamento visualizzato non ha nulla a che fare con il flag Pattern.CANON_EQ.

L'input letto dalla console non è lo stesso di un valore letterale stringa Java. Quando l'utente (presumibilmente, testando questo flag) digita \u00E5 nella console, la stringa risultante letta da console.readLine equivale a "\\u00E5", non "å". Guardate voi stessi: http://ideone.com/lF7D1

Per quanto riguarda Pattern.CANON_EQ, si comporta esattamente come descritto:

Pattern withCE = Pattern.compile("^a\u030A$",Pattern.CANON_EQ); 
Pattern withoutCE = Pattern.compile("^a\u030A$"); 
String input = "\u00E5"; 

System.out.println("Matches with canon eq: " 
    + withCE.matcher(input).matches()); // true 
System.out.println("Matches without canon eq: " 
    + withoutCE.matcher(input).matches()); // false 

http://ideone.com/nEV1V

+2

Sì e no. Una stringa è una stringa è una stringa, ma sei corretto nel senso che una stringa letta dalla console non ha bisogno di ulteriori escape, mentre un letterale stringa ha bisogno di escape. –

+0

@AdamMihalcin buona correzione. Ho arricchito la mia risposta un po 'di più, con una demo per illustrare con speranza la differenza di fuga. –

+0

Grazie. Andando avanti con il tutorial ora :) – Mustafa