2009-11-01 10 views
13

¿Es válida la expresión regular [a-Z] y si es así, entonces es lo mismo que [a-zA-Z]? Tenga en cuenta que en [a-Z] el a está en minúscula y la Z en mayúscula.¿Es válida la expresión regular [a-Z] y si es así, entonces es lo mismo que [a-zA-Z]?

Editar:

he recibido algunas respuestas especificando que mientras [az] no es válida, entonces [Az] es válida (pero no será el mismo que [a-zA-Z]) y esto es realmente lo que estaba buscando Ya que quería saber en general si es posible reemplazar [a-zA-Z] con una versión más compacta.

Gracias a todos los que contribuyeron a la respuesta.

Respuesta

33

No, a (97) es mayor que Z (90). [a-Z] no es una clase de caracteres válida. Sin embargo, [A-z] tampoco sería equivalente, pero por un motivo diferente. Cubriría todas las letras, pero también incluiría los caracteres entre mayúsculas y minúsculas: [\]^_`.

+1

Agregar un enlace a http://web.cs.mun.ca/~michael/c/ascii-table.html como referencia, ritmo yo por 15 segundos;) - Dedos rápidos ... +1 – gnarf

+0

Eso no es lo que preguntó sin embargo. –

+0

Sí, es ... '[a-Z]' no es válido porque 'Z' viene antes' a' – gnarf

2

Siempre se puede probar:

print "ok" if "monkey" =~ /[a-Z]/; 

Perl dice

 
Invalid [] range "a-Z" in regex; marked by <-- HERE in m/[a-Z <-- HERE ]/ at a-z.pl line 4. 
+2

Exactamente lo que dije. Mi proposición favorita es "pruébalo" nc "porque si te estás desarrollando en C en ese momento tiene dos significados. –

+3

No me gusta "pruébalo y mira" porque si hubiera intentado '[A-z]' no habría ningún mensaje de error pero tampoco funcionaría correctamente. –

+0

Esto es porque en ASCII, mayúsculas es lo primero. Entonces, [A-z] es válido, pero [a-Z] no lo es. – jheddings

4

no estoy seguro acerca de las implementaciones de otros idiomas, pero en PHP que puede hacer

"/[a-z]/i" 

y será insensible a mayúsculas/minúsculas. Probablemente haya algo similar para otros idiomas.

+0

La mayoría de las funciones de PHP provienen de Perl, incluida esta. (PHP solía escribirse en Perl. En realidad, una de las P solía representar a Perl) –

1

No, no es válida, probablemente debido a que los valores ASCII no son consecutivas de Z a A.

3

No se especifica qué idioma, pero en general no será [a-Z] un rango válido, como en ASCII los caracteres alfabéticos en minúsculas vienen después las mayúsculas. [A-z]podría ser un rango válido (que indica todos los alfas de mayúsculas y minúsculas, así como la puntuación que aparece entre Z y a), pero podría no serlo, dependiendo de su implementación particular. El indicador i se puede agregar a la expresión regular para que no distinga entre mayúsculas y minúsculas; verifique su implementación particular para obtener instrucciones sobre cómo especificar esa bandera.

2

Si es válido, no hará lo que espera.

El código de carácter de Z es menor que el código de carácter de un, así que si los códigos se intercambian en el sentido de la gama [Z-a], será el mismo que [Z\[\\\]^_`a], es decir, que incluirá los caracteres Z y a, y el personajes entre.

Si utiliza [A-z] para obtener todos los caracteres en mayúscula y minúscula, no es lo mismo que [A-Za-z], es lo mismo que [A-Z\[\\\]^_`a-z].

1

Acabo de caer sobre esto en un guión (no el mío).

Parece que grep, awk, sed acepta [a-Z] en función de su configuración regional (es decir, la variable de entorno LANG o LC_CTYPE).En POSIX, estas herramientas no permiten el [a-Z], pero en algunas otras configuraciones regionales (por ejemplo, en_gb.utf8) funciona, y es lo mismo que [a-zA-Z].

Sí, lo he comprobado, no coincide con ninguno de _^[]`.

Dado que esto ha llevado bastante tiempo para la depuración, recomiendo encarecidamente a cualquiera que alguna vez haya usado [a-Z] en una expresión regular.

Cuestiones relacionadas