Regex para que coincida solo con letras


374

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


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.


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


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


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


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


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)

13

Java:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}

44
no incluye signos diacríticos comoŹŻŚĄ
karoluS



7

Usar grupos de personajes

\D

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

^\D+$

Ver ejemplo aquí


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.


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.

4

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


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]+"

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


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 ......
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.