Regex para que coincida solo con letras

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

preguntado el 01 de septiembre de 10 a las 09:09

¿Cuál es tu definición de characters? ¿ASCII? ¿Kanji? ¿Iso-XXXX-X? UTF8? -

¿Cuál es tu definición de regex? ¿Perla? Emac? ¿Grupo? -

Me he dado cuenta que \ p {L} por una carta y /u bandera para Unicode coincide con cualquier letra en mi expresión regular, es decir /\p{L}+/u -

20 Respuestas

Utilice un juego 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]+$ coincide solo con cadenas que constan de una o más letras solamente (^ y $ marcar el comienzo y el final de una cadena respectivamente).

Si desea hacer coincidir otras letras que no sean de la A a la Z, puede agregarlas al conjunto de caracteres: [a-zA-ZäöüßÄÖÜ]. O usa clases de caracteres predefinidas como el Propiedad de carácter Unicode clase \p{L} que describe los caracteres Unicode que son letras.

Respondido el 01 de Septiembre de 10 a las 13:09

Esa es una solución muy centrada en ASCII. Esto se romperá en prácticamente cualquier texto que no esté en inglés. - Joaquín Sauer

@Joachim Sauer: Preferirá romper en idiomas que usen caracteres no latinos. - Gumbo

Ya se interrumpe en el 90% del texto en alemán, ni siquiera se menciona el francés o el español. Aunque al italiano todavía le irá bastante bien. - Ivo Wetzel

eso depende de la definición de "carácter latino" que 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. - Joaquín Sauer

\ p {L} coincide con todos los acentos sedilla de diéresis, etc., así que deberías seguir con eso. - Radu Simionescu

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

Respondido el 01 de Septiembre de 10 a las 13:09

no en todos los sabores de expresiones regulares. Por ejemplo, las expresiones regulares de vim tratan \p como "Carácter imprimible". - Philip Potter

esta página sugiere que solo las expresiones regulares java, .net, perl, jgsoft, XML y XPath sean compatibles con \ p {L}. Pero grandes omisiones: python y ruby ​​(aunque python tiene el módulo regex). - Philip Potter

@Philip Potter: Ruby admite propiedades de caracteres Unicode utilizando exactamente la misma sintaxis. - Jörg W. Mittag

Creo que esto debería ser \p{L}\p{M}*+ para cubrir letras compuestas por varios puntos de código, por ejemplo, una letra seguida de acentos. Según expresiones-regulares.info/unicode.html - ZoFreX

con Python 3 esto produce un error bad escape \p at position 0 - matanster

Dependiendo de su significado de "carácter":

[A-Za-z] - todas las letras (Mayúscula y minúscula)

[^0-9] - todos los caracteres que no son dígitos

Respondido 08 Feb 14, 01:02

Me refiero a 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 puede usar. Aún necesita 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

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 almacenar eso en una constante, en un archivo de configuración. - Catalina Chircu

La codificación de @CatalinaChircu es absolutamente irrelevante aquí. La codificación es una forma de codificar un punto de código en un juego de caracteres en binario, por ejemplo, UTF-8 es una codificación para Unicode. Las letras OTOH dependen del idioma, y ​​si se dice [A-Za-z] son letras, entonces se debe especificar el idioma que se está utilizando - phuclv

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 de usar

[a-zA-Z]+

como sugieren otros usuarios

Respondido 17 Oct 14, 12:10

Sin embargo, no coincidirá con ningún carácter especial. - Nyerguds

Usarías

/[a-z]/gi

[]: comprueba si hay caracteres entre las entradas dadas

az --- cubre todo el alfabeto

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

yo ----- obteniendo mayúsculas y minúsculas

Respondido el 24 de Septiembre de 17 a las 00:09

Java:

String s= "abcdef";

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

Respondido 15 Abr '18, 20:04

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

^ o cualquier letra cirílica - dimitar.bogdanov

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 hacer coincidir por primera vez, volverá. En vez de /i Solo usa /g que es para global y tampoco tienes necesidad de poner ^ $ para comenzar y terminar.

/[a-zA-Z]+/g
  1. [a-z _] + coincidir con un solo carácter presente en la lista a continuación
  2. Cuantificador: + Entre una y una cantidad ilimitada de veces, tantas veces como sea posible, devolviendo según sea necesario
  3. Arizona un solo carácter en el rango entre la a y la z (distingue entre mayúsculas y minúsculas)
  4. A-Z un solo carácter en el rango entre A y Z (distingue entre mayúsculas y minúsculas)
  5. g modificador: global. Todos los partidos (no regrese en el primer partido)

Respondido el 13 de Septiembre de 16 a las 08:09

/[a-zA-Z]+/

Ejemplo super sencillo. Las expresiones regulares son extremadamente fáciles de encontrar en línea.

http://www.regular-expressions.info/reference.html

Respondido el 01 de Septiembre de 10 a las 13:09

Para PHP, lo siguiente funcionará bien

'/^[a-zA-Z]+$/'

respondido 14 nov., 13:16

Usa grupos de personajes

\D

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

^\D+$

Ver ejemplo aquí

Respondido el 27 de junio de 17 a las 12:06

Esto también coincidirá con espacios en blanco, símbolos, etc., que no parece ser lo que pide la pregunta. - davidmangoose

Sólo tiene que utilizar \w or [:alpha:]. Es una secuencia de escape que solo coincide con los símbolos que pueden aparecer en palabras.

Respondido el 08 de junio de 14 a las 20:06

\w puede no ser una buena solución en todos los casos. Al menos en PCRE, \w también puede coincidir con otros personajes. Citando el Manual de PHP"Un carácter de "palabra" es cualquier letra o dígito o el carácter de subrayado, es decir, cualquier carácter que pueda formar 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 lleva a cabo una coincidencia específica de la localidad. Por ejemplo, en la configuración regional "fr" (francés), algunos códigos de caracteres superiores a 128 se utilizan para letras acentuadas, y estos se corresponden con \ w.". - Amal Murali

las palabras incluyen otros caracteres de letras - V-tímido

\w significa coincidir con letras y números - eugenio konkov

En Python, he encontrado que lo siguiente funciona:

[^\W\d_]

Esto funciona porque estamos creando una nueva clase de personaje (el []) que excluye (^) cualquier personaje de la clase \W (todo lo que NO está en [a-zA-Z0-9_]), también excluye cualquier dígito (\d) y también excluye el subrayado (_).

Es decir, hemos tomado la clase de personaje. [a-zA-Z0-9_] y quitó el 0-9 y _ bits. Podrías preguntar, ¿no sería más fácil escribir [a-zA-Z] entonces, en lugar de [^\W\d_]? Estaría en lo correcto si se trata solo de texto ASCII, pero cuando se trata de texto Unicode:

\W

Coincide con cualquier carácter que no sea un carácter de palabra. Esto es lo opuesto a \ w. > Si se usa el indicador ASCII, este se convierte en el equivalente de [^ a-zA-Z0-9_].

^ de la documentación del módulo python re

Es decir, estamos tomando todo lo que se considera un carácter de palabra en Unicode, eliminando todo lo que se considera un carácter de dígito en Unicode y también eliminando el guión bajo.

Por ejemplo, el siguiente fragmento de código

import re
regex = "[^\W\d_]"
test_string = "A;,./>>?()*)&^*&^%&^#Bsfa1 203974"
re.findall(regex, test_string)

Devoluciones

['A', 'B', 's', 'f', 'a']

Respondido 20 ago 20, 21:08

¿Qué pasa con las letras no latinas? Por ejemplo çéàñ. Tu expresión regular es menos legible que \p{L} - Toto

Respuesta inteligente. Funciona perfectamente también para letras acentuadas. - Frederic

Si te refieres a cualquier letra en cualquier codificación de caracteres, entonces un buen enfoque podría ser eliminar los espacios que no sean letras. \sdígitos \dy otros caracteres especiales como:

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

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

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

Pros:

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

Contras:

  • Larga, a veces no perfecta, pero la codificación de caracteres también puede romperse.

Respondido el 08 de junio de 14 a las 20:06

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

Respondido 29 Jul 14, 08:07

Eso no es lo que [^\W|\d] medio - OGHaza

[^\W|\d] significa no \W y no | y no \d. Tiene el mismo efecto neto desde | es parte de \W pero el | no funciona como crees. Incluso entonces eso significa que acepta la _ personaje. Probablemente estas buscando [^\W\d_] - OGHaza

Estoy de acuerdo contigo, acepta el _. Pero no" | es igual que "Y", por lo que [^\W|\d] significa: NO \W Y DE NO \d - Motlab

[^ab] significa no a y no b. [^a|b] significa no a y no | y no b. Para dar un segundo ejemplo [a|b|c|d] es exactamente lo mismo que [abcd|||] que es exactamente lo mismo que [abcd|] - todo lo cual equivale a ([a]|[b]|[c]|[d]|[|]) el | es un carácter literal, no un operador OR. El operador OR está implícito entre cada carácter en una clase de carácter, poniendo un | significa que quieres que la clase acepte el | carácter (tubería). - OGHaza

Entonces, he estado leyendo muchas respuestas y la mayoría de ellas no tienen en cuenta excepciones, como letras con acentos o diéresis (á, à, ä, etc.).

Hice una función en mecanografiado que debería ser prácticamente extrapolable a cualquier idioma que pueda usar RegExp. Esta es mi implementación personal para mi caso de uso en TypeScript. Lo que hice básicamente fue agregar rangos de letras con cada tipo de símbolo que quería agregar. También convertí el carácter a mayúsculas antes de aplicar la expresión regular, lo que me ahorra algo de trabajo.

function isLetter(char: string): boolean {
  return char.toUpperCase().match('[A-ZÀ-ÚÄ-Ü]+') !== null;
}

Si desea agregar otro rango de letras con otro tipo de acento, simplemente agréguelo a la expresión regular. Lo mismo ocurre con los símbolos especiales.

Implementé esta función con TDD y puedo confirmar que funciona con, al menos, los siguientes casos:

    character | isLetter
    ${'A'}    | ${true}
    ${'e'}    | ${true}
    ${'Á'}    | ${true}
    ${'ü'}    | ${true}
    ${'ù'}    | ${true}
    ${'û'}    | ${true}
    ${'('}    | ${false}
    ${'^'}    | ${false}
    ${"'"}    | ${false}
    ${'`'}    | ${false}
    ${' '}    | ${false}

respondido 26 mar '21, 14:03

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

pattern="[A-zÀ-ú\s]+"

Respondido 11 Feb 20, 18:02

Debería haber mirado una tabla ASCII. A-z coincide con algo más que letras, así como À-ú - Toto

JavaScript

Si desea devolver letras coincidentes:

('Example 123').match(/[A-Z]/gi) // Resultado: ["E", "x", "a", "m", "p", "l", "e"]

Si desea reemplazar letras coincidentes con estrellas ('*') por ejemplo:

('Example 123').replace(/[A-Z]/gi, '*') //Resultado: "****** 123 "*

Respondido 10 Jul 20, 11:07

Para letras más allá del inglés: /\p{Letter}/gu árbitro: desarrollador.mozilla.org/en-US/docs/Web/JavaScript/Guide/… - jave.web

/^[A-z]+$/.test('asd')
// true

/^[A-z]+$/.test('asd0')
// false

/^[A-z]+$/.test('0asd')
// false

Respondido 16 ago 20, 17:08

Hola @jarraga. Bienvenido a SO, ¿Leíste cómo responder una pregunta?. Debería ayudar a aclarar su respuesta y, por lo tanto, evitar votaciones negativas. - andres naguib

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

pone "[a-zA-Z]: # {pattern.match (" flor de mina ")}" 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

Respondido el 30 de junio de 14 a las 06:06

¿Y, por ejemplo, “Zażółć gęslą jaźń”? - El Testigo

Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

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

   ...do something ......
}

contestado el 24 de mayo de 16 a las 04:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.