Expresión regular para alfanuméricos y guiones bajos
Frecuentes
Visto 1,215 veces
20 Respuestas
1015
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
380
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
40
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
34
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
29
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
21
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
20
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
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
10
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
8
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
7
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
^ ... $
- haga coincidir el patrón que comienza y termina con[\d]*
- coincidir con cero o más dígitos[a-z_]
- coincidir con un alfabeto o guión bajo[a-z\d_]*
- coincidir con un alfabeto, un dígito o un subrayado/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
6
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
4
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
4
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
3
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
2
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
1
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
0
esto funciona para mí, puedes intentarlo
[\\p{Alnum}_]
Respondido 21 ago 19, 03:08
0
Formato requerido Permitir estos 3:
- 0142171547295
- 014-2171547295
- 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 regex or haz tu propia pregunta.
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. - Wiktor Stribiżew