2010-09-20 7 views
12

Me gustaría usar \ w pero también coincide con los guiones bajos, así que voy con [A-Za-z] que se siente innecesariamente detallado y centrado en América. ¿Hay una mejor manera de hacer esto? Algo así como [\ w^_] (dudo que tenga esa sintaxis correcta)?¿Cuál es la mejor manera de unir solo letras en una expresión regular?

+4

'[A-Za-z]' no está centrado en América, es ASCII-céntrico. – CanSpice

+0

@CanSpice, yo diría que es América-centrada, como ASCII es sólo utiliza el alfabeto latino. – Axeman

+1

@Axeman, Fuentes? AFAIK muchos idiomas derivados de latín han subrayado vocales y letras. [A-Za-z] no coincidirá ni con el Español ni con la Française. Incluso el latín puro tiene el glifo Æ que no está dentro de ASCII. ¿De qué latina estás hablando? – Kyordhel

Respuesta

7

Usted podría utilizar /[a-z]/i o /[[:alpha:]]/ igual de bien. De hecho, \w incluye números para que ni siquiera funcione.

+1

lo tomo I '' la hace sensible a las mayúsculas ? – keithjgrant

+0

Eso es correcto. – mkb

+1

Esto es simplemente una respuesta incorrecta. Lee abajo. –

15

Quizás se refiera a /[[:alpha:]]/? Ver perlre para la discusión de clases de caracteres POSIX.

+1

Todavía no creo que esto lleve los caracteres internacionales en consideración, ya que ': alpha:' 'sigue siendo a-zA-Z' – vol7ron

+0

Estaba equivocado; los perldocs deben actualizarse. Sin embargo sí incluye signos de puntuación adicionales: ''"'ˎˏːˑˬˮ' – vol7ron

+0

@ vol7tron: Tu comentario tiene una fuga ... –

1

¿Está buscando la internacionalización en su expresión regular? a continuación, tendrá que hacer algo como este chico hizo: JavaScript validation issue with international characters

coinciden explícitamente en todas las letras del lenguaje luna :)

+0

no veo ninguna carta de la luna en esa expresión regular, pero podría ser porque lo estoy leyendo la luz del día. – mkb

+0

Cuando los ves, que se supone que aullar – vol7ron

4

algunas opciones:

1. /[a-z]/i    # case insensitive 
2. /[A-Z]/i    # case insensitive 
3. /[A-z]/    # explicit range listing (capital 'A' to lowercase 'z') 
4. /[[:alpha:]]/   # POSIX alpha character class 

le recomiendo usar ya sea el caso -insensible, o la forma verdadera /[a-zA-z]/, a menos que tenga en mente una determinada preferencia de idioma.

Nota:

  • Número 3 requiere la capital 'A' primero y luego en minúscula 'z' debido a la orden de los valores ASCII; no funciona si haces lo contrario: a-Z. Además: este método no cumple los criterios de subrayado, ya que incluye[\]^_ `.
  • Número 4 coincidirá en esos caracteres de idiomas adicionales, sino que también coincide en:
    ʹʺʻˍˎˏːˑˬˮ̀́   (además de muchos otros)
+0

El '[A-Z]' gama incluye un montón de otros personajes. – NullUserException

+0

Tiene razón, hay algunos corchetes y caracteres adicionales, lo que rompería los criterios de no subrayar. He modificado la respuesta. @ moscas, sí, pero estaba equivocado. Realmente los dos primeros son el mismo método, solo muestra que puedes usar diferentes entradas. – vol7ron

8

Coincidencia de caracteres internacionales (es decir, que no son ASCII) es un poco difícil, y podría Depende de muchas cosas. Echa un vistazo a este ejemplo:

#!perl -w 

use strict; 
use utf8; 

my $string = "ä"; 

print "matched :alpha:\n" if $string =~ /[[:alpha:]]/; 
print "matched ^\\W0-9_\n" if $string =~ /[^\W0-9_]/; 
print "matched [a-zA-Z]\n" if $string =~ /[a-zA-Z]/; 
print "matched [a-z]i\n" if $string =~ /[a-z]/i; 
print "matched [A-z]\n" if $string =~ /[A-z]/; 

Para mí esto resulta en

matched :alpha: 

Si se quita el entonces use utf8 no coincide ninguna expresiones regulares.

En cuanto a this very relevant question, parece que es probable que desee use utf8 y echa un vistazo Unicode::Semantics.

Por supuesto, si usa caracteres ASCII rectos, cualquiera de las expresiones regulares mencionadas anteriormente funcionará.

+0

Tienes que tener cuidado con \ w y \ W en Perl. Últimamente es un objetivo móvil, así que no dependería de su definición. –

+0

Lo que su editor muestra como 'ä' puede no ser una letra en Perl. 'ä' = "\ xE4" no está definido en el juego de caracteres ASCII, por defecto Perl usará clases de caracteres ASCII para cadenas que no están codificadas como UTF8. Agregar 'use utf8;' tratará su código fuente como UTF8 y convertirá a "ä" en una cadena Unicode. En el juego de caracteres Unicode 'ä' es un personaje alfabético. Compare '$ string =" ä ";' versus '$ string = decode (" iso-8859-1 "," ä ");' sin 'use utf8;'. En el primer caso, Perl verá datos binarios, en el segundo los datos binarios se interpretarán como Latin-1 y se convertirán a UTF-8. –

11

Simplemente use \p{L} que significa "cualquier letra Unicode" y funciona en Perl (/\p{L}/). Probablemente necesite use utf8;.

Cuestiones relacionadas