¿Cuál es la mejor manera de combinar solo las letras en un regex?
Pregunta
Realmente me gustaría usar W, pero también coincide con los subrayadores, así que voy con [A-ZA-Z] que se siente innecesariamente detallado y en Estados Unidos centrados. ¿Hay una mejor manera de hacer esto? ¿Algo como [ w^_] (dudo que tengo esa sintaxis correcta)?
Solución
Podrías usar /[a-z]/i
o /[[:alpha:]]/
igual de bien. En realidad, \w
Incluye números para que ni siquiera funcione.
Otros consejos
Quizás te refieras /[[:alpha:]]/
? Ver perlre Para la discusión de las clases de personajes de Posix.
Solo usa \p{L}
lo que significa "cualquier carta unicode" y funciona en Perl (/\p{L}/
). Probablemente necesite use utf8;
.
Los personajes internacionales coincidentes (es decir, no ASCII) es un poco difícil y podrían depender de muchas cosas. Mira 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 mi resulta en
matched :alpha:
Si elimina el use utf8
Entonces ninguna de las expresiones regulares coincide.
Mirando a Esta pregunta muy relevante, parece que probablemente quieras use utf8
Y mira Unicode :: semántica.
Por supuesto, si está utilizando caracteres ASCII directos, cualquiera de las expresiones regulares antes mencionadas funcionará.
[^\W0-9_]
# or
[[:alpha:]]
Ver PERLDOC perlre
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
Recomiendo usar la forma de caso, o la verdadera forma /[a-zA-z]/
, a menos que tenga una determinada preferencia de lenguaje en mente.
Nota:
- El número 3 requiere la capital 'A' primero y luego 'z' en minúsculas debido al orden de los valores ASCII; No funciona si haces lo contrario:
a-Z
. También: Este método fallaría los criterios sin concurridos, ya que incluye [ \ ] ^ _ ` . - El número 4 coincidirá con esos caracteres de idioma adicional, pero también coincide con:
ʹʺʻˍˎˏːˑˬˮ̀́
(además muchos otros)
¿Estás buscando internacionalización en tu regex? Entonces tendrás que hacer algo como este tipo: Problema de validación de JavaScript con caracteres internacionales
coincidir explícitamente en todas las letras lingüísticas de la luna :)