Regex para que coincida solo con letras

374

¿Cómo puedo escribir una expresión regular que solo coincida con letras?

Nike
fuente
58
¿Cuál es tu definición de characters? ASCII? Kanji? Iso-XXXX-X? UTF8?
Ivo Wetzel
45
¿Cuál es tu definición de regex? Perl? Emacs? Grep?
Pascal Cuoq
44
Dado que la pregunta está en inglés, en un sitio en inglés, es justo asumir que la pregunta se refiere a caracteres en inglés.
vaer-k
1
Me he dado cuenta de que \ p {L} para una letra y / u bandera para Unicode coincide con cualquier letra en mi expresión regular, es decir/\p{L}+/u
MaxZoom
44
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. Esto es verdad. Como todos sabemos, ¡los angloparlantes NUNCA localizan sus aplicaciones!
Alex

Respuestas:

392

Utilice un conjunto de caracteres: [a-zA-Z]coincide con una letra de la A a la Z en minúsculas y mayúsculas. [a-zA-Z]+coincide con una o más letras y ^[a-zA-Z]+$solo coincide con cadenas que consisten en una o más letras solamente ( ^y $marca el comienzo y el final de una cadena respectivamente).

Si desea hacer coincidir otras letras que A-Z, puede añadirlos al conjunto de caracteres: [a-zA-ZäöüßÄÖÜ]. O utiliza clases de caracteres predefinidas como la clase de propiedad de caracteres Unicode\p{L} que describe los caracteres Unicode que son letras.

Gumbo
fuente
119
Esa es una solución muy centrada en ASCII. Esto se romperá en casi cualquier texto que no esté en inglés.
Joachim Sauer
77
@Joachim Sauer: Prefiere romper idiomas usando caracteres no latinos.
Gumbo
15
Ya se rompe en el 90% del texto en alemán, ni siquiera menciones francés o español. Sin embargo, el italiano aún podría hacerlo bastante bien.
Ivo Wetzel
99
eso depende de qué definición de "carácter latino" elija. Se puede argumentar que J, U, Ö, Ä son caracteres latinos o no, según su definición. Pero todos se usan en idiomas que usan el "alfabeto latino" para escribir.
Joachim Sauer
99
\ p {L} coincide con todos los acentos de sedilla de diéresis, etc.
Radu Simionescu
198

\p{L} coincide con cualquier cosa que sea una letra Unicode si está interesado en alfabetos más allá del latín

RobV
fuente
2
no en todos los sabores regex. Por ejemplo, las expresiones regulares vim se tratan \pcomo "caracteres imprimibles".
Philip Potter el
3
esta página solo sugiere compatibilidad con expresiones regulares java, .net, perl, jgsoft, XML y XPath \ p {L}. Pero omisiones importantes: python y ruby ​​(aunque python tiene el módulo regex).
Philip Potter
66
@Philip Potter: Ruby admite propiedades de caracteres Unicode usando exactamente la misma sintaxis.
Jörg W Mittag
66
Creo que esto debería ser \p{L}\p{M}*+para cubrir letras formadas por múltiples puntos de código, por ejemplo, una letra seguida de acentos. Según regular-expressions.info/unicode.html
ZoFreX
con python 3 esto produce un errorbad escape \p at position 0
matanster
46

Dependiendo de su significado de "personaje":

[A-Za-z]- todas las letras (mayúsculas y minúsculas)

[^0-9] - todos los caracteres sin dígitos

KristofMols
fuente
Me refería a las letras. Sin embargo, no parece estar funcionando. preg_match ('/ [a-zA-Z] + /', $ nombre);
Nike
[A-Za-z] es solo la declaración de caracteres que puedes usar. Aún debe declarar cuántas veces se debe usar esta declaración: [A-Za-z] {1,2} (para que coincida con 1 o 2 letras) o [A-Za-z] {1, *} (para que coincida 1 o más letras)
KristofMols
17
bueno à, á, ã, Ö, Ä ... también son letras, también lo son অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ א, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv
@phuclv: De hecho, pero eso depende de la codificación, y la codificación es parte de la configuración del programa (ya sea la configuración predeterminada o la declarada en un archivo de configuración del programa). Cuando trabajaba en diferentes idiomas, solía almacenarlo en una constante, en un archivo de configuración.
Catalina Chircu
1
La codificación @CatalinaChircu es absolutamente irrelevante aquí. La codificación es una forma de codificar un punto de código en un conjunto de caracteres en binario, por ejemplo, UTF-8 es una codificación para Unicode. Las letras OTOH dependen del idioma, y ​​si uno dice que [A-Za-z]son letras, entonces debe especificarse el idioma que se está usando
phuclv
32

La opción más cercana disponible es

[\u\l]+

que coincide con una secuencia de letras mayúsculas y minúsculas. Sin embargo, no es compatible con todos los editores / idiomas, por lo que probablemente sea más seguro usar

[a-zA-Z]+

como sugieren otros usuarios

nota azul
fuente
1
Sin embargo, no coincidirá con ningún personaje especial.
Nyerguds
20

Usarías

/[a-z]/gi

[] - verifica si hay caracteres entre las entradas dadas

az --- cubre todo el alfabeto

g ----- globalmente a lo largo de toda la cadena

i ----- obteniendo mayúsculas y minúsculas

Scott
fuente
14

La expresión regular que pocas personas han escrito como "/ ^ [a-zA-Z] $ / i" no es correcta porque al final han mencionado / i, que no distingue entre mayúsculas y minúsculas y, después de la coincidencia por primera vez, volverá. En lugar de / i, solo uso / g, que es para global y tampoco es necesario poner ^ $ para comenzar y finalizar.

/[a-zA-Z]+/g
  1. [a-z _] + coincide con un solo personaje presente en la lista a continuación
  2. Cuantificador: + Entre una e ilimitadas veces, tantas veces como sea posible, devolviendo según sea necesario
  3. Arizona un solo carácter en el rango entre a y z (mayúsculas y minúsculas)
  4. Arizona un solo carácter en el rango entre A y Z (mayúsculas y minúsculas)
  5. Modificador g : global. Todos los partidos (no volver en el primer partido)
Yogesh Chauhan
fuente
13

Java:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}
Udeshika Sewwandi
fuente
44
no incluye signos diacríticos comoŹŻŚĄ
karoluS
11

Para PHP, lo siguiente funcionará bien

'/^[a-zA-Z]+$/'
Rohit Dubey
fuente
7

Usar grupos de personajes

\D

Coincide con cualquier carácter, excepto los dígitos 0-9

^\D+$

Ver ejemplo aquí

Tomáš Nedělka
fuente
8
Esto también coincidirá con espacios en blanco, símbolos, etc., que no parece ser lo que la pregunta está pidiendo.
DaveMongoose
Extraño. Acabo de recibir un voto negativo sobre esto, ¡y no soy yo!
Dave Everitt
6

Solo usa \wo [:alpha:]. Es una secuencia de escape que solo coincide con los símbolos que pueden aparecer en las palabras.

Agaspher
fuente
99
\wpuede no ser una buena solución en todos los casos. Al menos en PCRE, también \wpuede coincidir con otros personajes. Citando el manual de PHP : el carácter " Una" palabra "es cualquier letra o dígito o el carácter de subrayado, es decir, cualquier carácter que puede ser parte de una" palabra "de Perl. La definición de letras y dígitos está controlada por las tablas de caracteres de PCRE, y puede variar si se realiza una coincidencia específica de la localidad. Por ejemplo, en la localidad "fr" (francés), algunos códigos de caracteres superiores a 128 se usan para letras acentuadas, y estos se corresponden con \ w ".
Amal Murali
las palabras incluyen otros caracteres de letras
V-SHY
2
\wsignifica letras y números coincidentes
Eugen Konkov
4

Si te refieres a letras en cualquier codificación de caracteres, entonces un buen enfoque podría ser eliminar letras, como espacios \s, dígitos \dy otros caracteres especiales como:

[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]

O utilice la negación de la negación anterior para describir directamente cualquier letra:

\S \D and [^  ..special chars..]

Pros:

  • Funciona con todos los sabores regex.
  • Fácil de escribir, a veces ahorra mucho tiempo.

Contras:

  • Largo, a veces no perfecto, pero la codificación de caracteres también puede romperse.
Sławomir Lenart
fuente
4

Puedes probar esta expresión regular: [^\W\d_]o [a-zA-Z].

Motlab
fuente
Eso no es lo que [^\W|\d] significa
OGHaza
1
[^\W|\d]significa no \Wy no |y no \d. Tiene el mismo efecto neto ya que |es parte de \Wpero |no funciona como crees que lo hace. Incluso entonces eso significa que acepta el _personaje. Probablemente estés buscando[^\W\d_]
OGHaza
Estoy de acuerdo contigo, acepta el _. Pero "NO" |es igual a "Y", entonces [^\W|\d]significa: NO \W Y NO\d
Motlab
12
[^ab]significa no ay no b. [^a|b]significa no ay no |y no b. Para dar un segundo ejemplo [a|b|c|d]es exactamente el mismo que el [abcd|||]que es exactamente el mismo que [abcd|]- todos los cuales equivalen a ([a]|[b]|[c]|[d]|[|])la |es un carácter literal, no un operador OR. El operador OR está implícito entre cada carácter en una clase de caracteres, lo que |significa que quiere que la clase acepte el carácter |(canalización).
OGHaza
1

Últimamente he usado este patrón en mis formularios para verificar nombres de personas, que contienen letras, espacios en blanco y caracteres especiales como los acentos.

pattern="[A-zÀ-ú\s]+"
camilablnpa
fuente
Deberías haber mirado una tabla ASCII. A-zcoincide con más que solo letras, así comoÀ-ú
Toto
0

patrón = / [a-zA-Z] /

pone "[a-zA-Z]: # {pattern.match (" mine blossom ")}" OK

pone "[a-zA-Z]: # {pattern.match (" 456 ")}"

pone "[a-zA-Z]: # {pattern.match (" ")}"

pone "[a-zA-Z]: # {pattern.match (" # $% ^ & * ")}"

pone "[a-zA-Z]: # {pattern.match (" # $% ^ & * A ")}" OK

Snm Maurya
fuente
3
¿Y por ejemplo, "Zażółć gęslą jaźń"?
The Witness
-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

if (pattern.matcher("a").find()) {

   ...do something ......
}
Fikreselam Elala
fuente