2011-11-30 4 views
7

Me gustaría hacer una expresión regular en Perl que pruebe una cadena para caracteres en una secuencia de comandos en particular. Esto sería algo así como:¿Cómo puedo ejecutar una expresión regular que prueba texto para caracteres en un alfabeto o secuencia de comandos en particular?

$text =~ .*P{'Chinese'}.* 

¿Hay una manera sencilla de hacer esto, de Inglés que es bastante fácil con sólo las pruebas de [a-zA-Z], pero para un guión como el chino, o una de las Los scripts japoneses, no puedo encontrar ninguna forma de hacer esto sin escribir cada carácter explícitamente, lo que haría un código muy feo. Ideas? No puedo ser la primera/única persona que quiere hacer esto.

+0

[Esto] (http://stackoverflow.com/questions/4611425/how-to-count-the-chinese-word-in-a-file-using-regex-in-perl) parece útil. – TLP

+1

Relacionados: http://stackoverflow.com/questions/6937087/detect-chinese-character-using-perl#6939500 – daxim

Respuesta

9

Mire perldoc perluniprops, que proporciona una lista exhaustiva de propiedades que puede usar con \p. Usted estará interesado en \p{CJK_Unified_Ideographs} y propiedades relacionadas como \p{CJK_Symbols_And_Punctuation}. \p{Hiragana} y \p{Katakana} le dan el kana. También hay una propiedad \p{Script=...} para un número de secuencias de comandos: \p{Han} y \p{Script=Han} coinciden con los caracteres Han (chinos), pero no existe el correspondiente \p{Script=Japanese}, simplemente porque el japonés tiene varias secuencias de comandos.

+0

Pensé [Hiragana] (http://en.wikipedia.org/wiki/Hiragana) y [Katakana ] (http://en.wikipedia.org/wiki/Katakana) fueron utilizados en japonés. – ikegami

+0

@ikegami: Correcto. El OP mencionó japonés. –

+0

¡Uy! Me lo perdí. – ikegami

4

Hay dos formas de hacerlo. Por bloque (\p{Block=...}) y por script (\p{Script=...}). Este último es probablemente más natural.

No sé mucho sobre los idiomas chinos, pero creo que quiere \p{Script=Han} también conocido como \p{Han} para chino.

japonés utiliza tres guiones:

  • Kanij: \p{Script=Han} aka \p{Han}
  • Hiragana: \p{Script=Hiragana} aka \p{Hiragana} aka \p{Hira}
  • Katakana: \p{Script=Katakana} aka \p{Katakana} aka \p{Kana}

usted podría tomar una mira perluniprops para encontrar el que está buscando, o puede usar uniprops * para encontrar qué propiedades coinciden con un carácter específico.

$ uniprops 4E2D 
U+4E2D ‹中› \N{CJK UNIFIED IDEOGRAPH-4E2D} 
    \w \pL \p{L_} \p{Lo} 
    All Any Alnum Alpha Alphabetic Assigned InCJK_UnifiedIdeographs 
    CJK_Unified_Ideographs L Lo Gr_Base Grapheme_Base Graph GrBase 
    Han Hani ID_Continue IDC ID_Start IDS Ideo Ideographic Letter 
    L_ Other_Letter Print UIdeo Unified_Ideograph Word XID_Continue 
    XIDC XID_Start XIDS X_POSIX_Alnum X_POSIX_Alpha X_POSIX_Graph 
    X_POSIX_Print X_POSIX_Word 

Para saber en qué personajes están en una propiedad determinada, puede utilizar unichars *. (Esto es de utilidad limitada ya que la mayoría de los caracteres CJK no se nombran.)

$ unichars -au '\p{Han}' 
⺀ U+2E80 CJK RADICAL REPEAT 
⺁ U+2E81 CJK RADICAL CLIFF 
⺂ U+2E82 CJK RADICAL SECOND ONE 
⺃ U+2E83 CJK RADICAL SECOND TWO 
⺄ U+2E84 CJK RADICAL SECOND THREE 
⺅ U+2E85 CJK RADICAL PERSON 
⺆ U+2E86 CJK RADICAL BOX 
⺇ U+2E87 CJK RADICAL TABLE 
⺈ U+2E88 CJK RADICAL KNIFE ONE 
... 

* — uniprops y unichars están disponibles en el Unicode::Tussle distribución.

Cuestiones relacionadas