2011-10-05 18 views
7

Ho riscontrato un problema interessante relativo al metodo delle corrispondenze String (RegExp).Strano comportamento del metodo matches() di String

assertTrue("33CCFF".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC33FF".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC3355".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC9955".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC3366".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC3965".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC1961".matches("[0-9A-Za-z]{6}")); 
assertTrue("CC9999".matches("[0-9A-Za-z]{6}")); 
assertTrue("СС3966".matches("[0-9A-Za-z]{6}")); // failing 
assertTrue("СС9965".matches("[0-9A-Za-z]{6}")); // failing 
assertTrue("СС9966".matches("[0-9A-Za-z]{6}")); // failing 

Gli ultimi 3 asserzione non riesce inaspettatamente. Non sono riuscito a trovare alcun motivo per cui questo strano comportamento stia accadendo. Hai lo stesso problema? Hai qualche idea?

A proposito, in caso di richiesta, la mia versione di Java è la seguente.

java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 
+0

Ho studiato dopo le tue risposte e ho notato che i caratteri C in alto (& # 0043) sono diversi dai caratteri C più bassi (& # 1057). I caratteri C nelle ultime 3 righe sembrano essere dall'alfabeto cirillico. http://webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm – lemiorhan

+0

Il problema si verifica a causa dell'input dell'utente. Per verificare se l'input è alfa-decimale (anche per Cyrillic C), org.apache.commons.lang.StringUtils.isAlphanumeric() restituisce true come segue: assertTrue (StringUtils.isAlphanumeric ("\ u0421 \ u0421")) ; // cirillico C assertTrue (StringUtils.isAlphanumeric ("\ u00E7 \ u00E7")); // ascii C – lemiorhan

risposta

15

Gli ultimi tre non realtà inizio con un carattere ASCII "C". Iniziano con un carattere non ASCII che sembra come "C". Ciò non corrisponde a nulla nel set [0-9A-Za-z], quindi il modello fallisce.

(ho trovato questo fuori copiando e incollando il codice in un editor di testo che non gestisce i caratteri non ASCII terribilmente bene - "?". Uscirono come)

+0

A destra, il codice HEX del carattere C errato è '0x3F', ma per tutti i precedenti' C' è '0x43' – sll

+1

@sll: No, il 3F è solo"? " che viene spesso utilizzato per rappresentare personaggi che non possono altrimenti essere rappresentati. Il carattere mostrato è * non * "?". –

+0

buona cattura! Sembra che il mio editor abbia sostituito questo carattere con '' 'prima di salvare – sll

2

vostro "СС3966" (I taglia e incolla) vengono contrassegnati come non UTF-8, motivo per cui reg-ex non li abbina. Quando cambio il tuo testo e lo digito da solo, funziona come previsto. Non so da dove hai copiato questi valori, ma questo è il tuo problema

+0

Ho capito il tuo punto. Hai trovato il problema come JonSkeet. Grazie mille per la tua risposta. – lemiorhan

+0

È divertente ... John e ho trovato la stessa risposta, l'ho trovato 1 minuto prima di lui ... ottiene 12 voti positivi, io 1 :) Sembra che questo sia un concorso di popolarità dopo tutto! lol. –

+1

btw, quando ho incollato la tua corrispondenza nella mia eclissi e ho provato a salvare, ho visualizzato una finestra di dialogo che diceva che sto cercando di salvare il testo non UTF-8. Non penso di aver modificato le mie impostazioni di eclissi, quindi dovresti capire perché il tuo non ti sta dando lo stesso avviso per problemi futuri come questo. –