2012-09-29 6 views
6

Questo comandoGNU grep regex `[一 - 十]` (1-10) non corrisponde al 四 carattere cinese (quattro)

$ echo '一二三四五六七八九十' | grep -oE '[一-十]' 

uscite:

一 
二 
三 
五 
六 
七 
八 
九 
十 

La regex [一-十] (da uno a dieci) dovrebbe corrispondere ai numeri cinesi. Come nell'esempio, corrisponde a tutti i numeri cinesi da uno a dieci, eccetto il carattere cinese (quattro)

Perché?

È un bug o uno scherzo?

Posso pensare questo come uno scherzo, perché in cinese '四' (quattro) suona allo stesso modo '事' (cosa). In effetti, in alcuni dialetti cinesi, condividono la stessa pronuncia. Quindi '一 二三 五六七 八 九十' (uno due tre cinque sette sette otto nove dieci) implica '沒 四' (non quattro), cioè '沒事' (niente)

BTW, la versione del grep che uso:

GNU grep 2.5.4 

risposta

7

I numeri cinesi non sono in ordine in Unicode. Quella 四 è U + 56DB, mentre 一 è U + 4E00, e 10 è 5341. Quindi il 4 non va bene.

Leggere lo standard Unicode per ulteriori informazioni e vedere http://www.unicode.org/charts/PDF/U4E00.pdf.

+0

Grazie per la tua rapida risposta. Howerver, io uso '-' (caratteri ascii, non cinesi) invece di '一'. Quindi corrisponde a un intervallo. Puoi modificare la tua risposta? Allora posso accettarlo. – weakish

+0

@wwishish bmargulies sta parlando del primo carattere del tuo intervallo, non del trattino tra gli endpoint. – lanzz

+0

@lanzz Grazie per sottolineare il mio errore. '一' e '-' sono simili. Avrei dovuto notare 'U + 4E00'. – weakish

2

ho chiesto questo su un forum cinese, e alvin_rxg contrappone questo:

一 => U+4E00 
十 => U+5341 
四 => U+56DB 

Così ho conosciuto ho appena fatto una supposizione stupida! grep non è così intelligente. L'espressione regolare [一 - 十] (da uno a dieci) è non che si prevede corrisponda ai numeri cinesi. Corrisponde a qualsiasi carattere tra '一' (U + 4E00) e '十' (U + 5341). Accade semplicemente che tutti i numeri cinesi siano compresi nell'intervallo tranne "四" (U + 56DB)!

Questo può essere usato come uno scherzo freddo, però. ;-)

Problemi correlati