Expresión regular para alfanuméricos y guiones bajos

Me gustaría tener una expresión regular que verifique si una cadena contiene solo letras mayúsculas y minúsculas, números y guiones bajos.

preguntado el 03 de diciembre de 08 a las 02:12

Es una lástima que los diferentes motores de expresiones regulares tengan diferentes medios para hacer coincidir los caracteres alfanuméricos. Una pregunta como esta (bastante vaga, sin indicación de idioma / expresión regular) requiere una respuesta muy larga, o al menos muy organizada, que se concentre en cada sabor. -

20 Respuestas

Para hacer coincidir una cadena que contiene , solamente esos caracteres (o una cadena vacía), intente

"^[a-zA-Z0-9_]*$"

Esto funciona para expresiones regulares .NET y probablemente también para muchos otros lenguajes.

Desglosando:

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

Si no desea permitir cadenas vacías, use + en lugar de *.


Como han señalado otros, algunos lenguajes de expresiones regulares tienen una forma abreviada para [a-zA-Z0-9_]. En el lenguaje de expresiones regulares .NET, puede activar el comportamiento de ECMAScript y usar \w como taquigrafía ^\w*$ or ^\w+$). Tenga en cuenta que en otros idiomas, y de forma predeterminada en .NET, \w es algo más amplio y también coincidirá con otros tipos de caracteres Unicode (gracias a Jan por señalar esto). Entonces, si realmente tiene la intención de igualar , solamente esos caracteres, usar la forma explícita (más larga) es probablemente lo mejor.

Respondido 09 Abr '20, 19:04

Si alguna vez vas a Alemania o si alguna vez ves cualquier texto en alemán, verás lo que estoy diciendo. - Programador de Windows

\ w y [A-Za-z0-9_] no son equivalentes en la mayoría de los sabores de expresiones regulares. \ w incluye letras con signos diacríticos, letras de otros guiones, etc. - Jan Goyvaerts

La pregunta original decía "letras mayúsculas y minúsculas", por lo que parecería que las "letras" de escrituras no latinas deberían coincidir. - Trejkaz

[\p{upper}\p{lower}\p{gc=Number}_] es todo lo que necesita para hacer esto correctamente, asumiendo que no hay caracteres combinados. - cristo

¿Qué está pasando con todos los votos a favor? Esto no es correcto. Solo funciona para inglés. Si va a realizar una edición, EDÍTELA. No agregue un "Editar:", simplemente hágalo correcto. - doug65536

Hay mucha verbosidad aquí, y estoy profundamente en contra, por lo que mi respuesta concluyente sería:

/^\w+$/

\w es equivalente a [A-Za-z0-9_], que es más o menos lo que quieres. (a menos que introduzcamos unicode en la mezcla)

Usando el patrón de velas del + cuantificador coincidirá con uno o más caracteres. Si también desea aceptar una cadena vacía, use * preferiblemente.

Respondido el 05 de diciembre de 08 a las 05:12

\w por lo general, no se limita solo a ASCII. - cristo

El inglés no es el único idioma del mundo, por lo que esta debería ser la respuesta aceptada, no la [a-z] y sus variaciones. \w también capturará caracteres no latinos. Como šēēā or кукареку - Alex

Validado en la página 318 de O'Reilly "Mastering Regular Expressions" - guidotex

\w es equivalente a [a-zA-Z0-9_] en ECMAScript (es decir, lo que se ejecuta en su navegador web moderno), lo que implica que ambos están restringidos a ASCII allí. - amén

Quieres comprobar que cada carácter coincide con tus requisitos, por eso utilizamos:

[A-Za-z0-9_]

E incluso puedes usar la versión abreviada:

\w

Que es equivalente (en algunos sabores de expresiones regulares, así que asegúrese de verificar antes de usarlo). Luego, para indicar que toda la cadena debe coincidir, usa:

^

Para indicar que la cadena debe comenzar con ese carácter, luego use

$

Para indicar la cadena debe terminar con ese carácter. Entonces usa

\w+ or \w*

Para indicar "1 o más", o "0 o más". Poniéndolo todo junto, tenemos:

^\w*$

Respondido el 03 de diciembre de 08 a las 08:12

\ w y [A-Za-z0-9_] no son equivalentes en la mayoría de los sabores de expresiones regulares. \ w incluye letras con signos diacríticos, letras de otros guiones, etc. - Jan Goyvaerts

Son equivalentes a ECMAScript. - amén

Um ... pregunta: ¿Necesita tener al menos un carácter o no? ¿Puede ser una cadena vacía?

^[A-Za-z0-9_]+$

Hará al menos un guión bajo o alfanumérico en mayúsculas o minúsculas. Si puede ser de longitud cero, simplemente sustituya el + por *

^[A-Za-z0-9_]*$

Edit:

Si es necesario incluir signos diacríticos (como cedilla - ç), entonces deberá usar la palabra carácter que hace lo mismo que el anterior, pero incluye los caracteres diacríticos:

^\w+$

Or

^\w*$

Respondido el 03 de diciembre de 08 a las 14:12

Bueno, ahora que lo mencionas, también me perdí un montón de otros personajes franceses ... - benalabastro

\ w es lo mismo que [\ w] con menos esfuerzo de escritura - Jan Goyvaerts

Sí, todavía necesita el + o * y el ^ y $ - \ w solo comprueba que contiene caracteres de palabra, no que , solamente contiene caracteres de palabra ... - benalabastro

curiosamente, esto todavía permite el signo $. - industrial

@Induster, es por lo que BenAlabaster acaba de señalar: Sebas

Aunque es más detallado que \w, Personalmente aprecio la legibilidad de los nombres completos de las clases de caracteres POSIX ( http://www.zytrax.com/tech/web/regex.htm#special ), entonces yo diría:

^[[:alnum:]_]+$

Sin embargo, aunque la documentación de los enlaces anteriores establece que \w "Coincidirá con cualquier carácter en el rango 0 - 9, A - Z y a - z (equivalente a POSIX [: alnum:])", no he encontrado que esto sea cierto. No con grep -P de todas formas. Debe incluir explícitamente el guión bajo si usa [:alnum:] pero no si usas \w. No se puede superar lo siguiente para breve y dulce:

^\w+$

Junto con la legibilidad, el uso de las clases de caracteres POSIX (http://www.regular-expressions.info/posixbrackets.html) significa que su expresión regular puede funcionar en cadenas no ASCII, lo que las expresiones regulares basadas en rango no harán ya que dependen del orden subyacente de los caracteres ASCII que pueden ser diferentes de otros conjuntos de caracteres y, por lo tanto, excluirán algunos caracteres no ASCII ( letras como œ) que quizás desee capturar.

Respondido el 29 de diciembre de 14 a las 05:12

En Ciencias de la Computación, un valor alfanumérico a menudo significa que el primer carácter no es un número, sino un alfabeto o un guión bajo. A partir de entonces, el personaje puede ser 0-9, A-Z, a-z, o subrayado (_).

Así es como lo haría:

Probado en php:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

o toma esto

^[A-Za-z_][A-Za-z\d_]*$

y colóquelo en su lenguaje de desarrollo.

Respondido el 14 de Septiembre de 17 a las 20:09

Qué tal si:

^([A-Za-z]|[0-9]|_)+$

... si quieres ser explícito, o:

^\w+$

... si lo prefiere conciso (sintaxis Perl).

Respondido el 03 de diciembre de 08 a las 04:12

use lookaheads para hacer "al menos una" cosas. Créame, es mucho más fácil.

Aquí hay un ejemplo que requeriría de 1 a 10 caracteres, que contiene al menos un dígito y una letra:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

NOTA: podría haber usado \ w pero luego entran en juego consideraciones ECMA / Unicode aumentando la cobertura de caracteres del \ w "carácter de palabra".

respondido 12 nov., 11:18

¿Cómo haríamos si quisiéramos agregar _ y - a la lista? - Rahi

Prueba estas extensiones multilingües que he hecho para cuerdas.

IsAlphaNumeric: la cadena debe contener al menos 1 alfa (letra en el rango Unicode, especificada en charSet) y al menos 1 número (especificado en numSet). Además, la cadena debe estar formada solo por alfa y números.

IsAlpha: la cadena debe contener al menos 1 alfa (en el idioma charSet especificado) y comprender solo alfa.

IsNumeric: la cadena debe contener al menos 1 número (en el idioma especificado numSet) y comprender solo números.

Se puede especificar el rango charSet / numSet para el idioma deseado. Los rangos Unicode están disponibles en el siguiente enlace:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

API:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

Uso:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

Respondido el 12 de enero de 12 a las 05:01

@Shah: He agregado los únicos alfabetos (y también solo los números). - Shantanu

La siguiente expresión regular coincide con caracteres alfanuméricos y guiones bajos:

^[a-zA-Z0-9_]+$

Por ejemplo, en Perl:

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}

Respondido el 05 de diciembre de 08 a las 04:12

El patrón en su código es correcto, pero el patrón anterior solo verifica una única instancia. - benalabastro

Eso fue intencional, la muestra de código tenía la intención de aclarar el uso en la verificación de una cadena. También por qué el código tiene el principio y el final de los marcadores de línea que no están en el ejemplo de expresiones regulares. - arrendajo

@ Programador de Windows - en.wikipedia.org/wiki/Alphanumeric - latino alfabeto, no "conjunto de caracteres latinos", que es lo que incluye signos diacríticos, etc. Es puramente una cuestión de semántica, pero yo personalmente uso el uso común del término alfanumérico como AZ y 0-9. - arrendajo

ñ es una letra del alfabeto en español, incluso en América Latina. - Programador de Windows

"Me gustaría tener una expresión regular que verifique si una cadena contiene solo letras mayúsculas y minúsculas, números y guiones bajos" no se limita a letras latinas. "La siguiente expresión regular coincide con caracteres alfanuméricos y subrayado" no se limita a letras latinas. "^ [a-zA-Z0-9 _] + $" falla. - Programador de Windows

Esto debería funcionar en la mayoría de los casos.

/^[\d]*[a-z_][a-z\d_]*$/gi

Y por la mayoría me refiero

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


Explicación

  1. ^ ... $ - haga coincidir el patrón que comienza y termina con
  2. [\d]* - coincidir con cero o más dígitos
  3. [a-z_] - coincidir con un alfabeto o guión bajo
  4. [a-z\d_]* - coincidir con un alfabeto, un dígito o un subrayado
  5. /gi - coincidir globalmente en la cadena y no distingue entre mayúsculas y minúsculas

Respondido el 24 de diciembre de 19 a las 06:12

La pregunta original no requería que la carta estuviera presente. - Dmitri Kuzminov

¿De qué letra estás hablando? Mi expresión regular contiene la que se hizo en la pregunta. Alfabetos, números, subrayado - Chinmaya Pati

La 1234 es la palabra del idioma solicitado por el autor. Tu lenguaje es más restrictivo. - Dmitri Kuzminov

Esto funciona para mí, encontré esto en "Mastering Regular Expressions" de O'Reilly:

/^\w+$/

Explicación:

  • ^ afirma la posición al comienzo de la cadena
    • \ w + coincide con cualquier carácter de palabra (igual a [a-zA-Z0-9_])
    • "+" Quantifier - Coincide entre una e ilimitadas veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso)
  • $ afirma la posición al final de la cadena

Verifíquese usted mismo:

const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

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

Para mí, hubo un problema en el sentido de que quiero distinguir entre alfanumérico, numérico y alfanumérico, por lo que para asegurarme de que una cadena alfanumérica contiene al menos un alfanumérico y al menos un numérico, utilicé:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

Respondido el 11 de enero de 12 a las 01:01

Exactamente lo que quiero ... Gracias - Col rizada

Para aquellos de ustedes que buscan una coincidencia alfanumérica Unicode, es posible que desee hacer algo como:

^[\p{L} \p{Nd}_]+$

Leer más en http://unicode.org/reports/tr18/ y en http://www.regular-expressions.info/unicode.html

Respondido 06 Feb 13, 11:02

Si solo quiere latín, haga p {Latin} en lugar de p {L} - Agustin

Aquí está la expresión regular de lo que desea con un cuantificador para especificar al menos 1 carácter y no más de 255 caracteres

[^a-zA-Z0-9 _]{1,255}

Respondido 21 ago 19, 10:08

Creo que no está tomando caracteres latinos y Unicode en sus coincidencias. Por ejemplo, si necesita utilizar caracteres "ã" o "ü", el uso de "\ w" no funcionará.

Alternativamente, puede utilizar este enfoque:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

¡Espero eso ayude!

Respondido 08 Feb 19, 14:02

Para verificar toda la cadena y no permitir cadenas vacías, intente

^[A-Za-z0-9_]+$

Respondido el 03 de diciembre de 08 a las 04:12

^\w*$ funcionará para las siguientes combinaciones

1
123
1av
pRo
av1

Respondido 21 ago 19, 10:08

¿Qué pasa con una línea vacía? ¿También es una cadena alfanumérica? - v010dya

esto funciona para mí, puedes intentarlo

[\\p{Alnum}_]

Respondido 21 ago 19, 03:08

Formato requerido Permitir estos 3:

  1. 0142171547295
  2. 014-2171547295
  3. 123abc

No permita otros formatos:

validatePnrAndTicketNumber(){
    let alphaNumericRegex=/^[a-zA-Z0-9]*$/;
    let numericRegex=/^[0-9]*$/;
    let numericdashRegex=/^(([1-9]{3})\-?([0-9]{10}))$/;
   this.currBookingRefValue = this.requestForm.controls["bookingReference"].value;
   if(this.currBookingRefValue.length == 14 && this.currBookingRefValue.match(numericdashRegex)){
     this.requestForm.controls["bookingReference"].setErrors({'pattern': false});
   }else if(this.currBookingRefValue.length ==6 && this.currBookingRefValue.match(alphaNumericRegex)){
    this.requestForm.controls["bookingReference"].setErrors({'pattern': false});
   }else if(this.currBookingRefValue.length ==13 && this.currBookingRefValue.match(numericRegex) ){
    this.requestForm.controls["bookingReference"].setErrors({'pattern': false});
   }else{
    this.requestForm.controls["bookingReference"].setErrors({'pattern': true});
   }
}
<input name="booking_reference" type="text" [class.input-not-empty]="bookingRef.value"
    class="glyph-input form-control floating-label-input" id="bookings_bookingReference"
    value="" maxlength="14" aria-required="true" role="textbox" #bookingRef
    formControlName="bookingReference" (focus)="resetMessageField()" (blur)="validatePnrAndTicketNumber()"/>

Respondido 13 Oct 20, 12:10

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