EDITAR: Recientemente descubrí (con la ayuda de algunos usuarios amables de Stack Overflow) que hay videos válidos de YouTube que son solo letras.
La misma pregunta que aquí pero con la adición de verificar letras en la ecuación .
Me preguntaba si es posible que las identificaciones de video de los videos de YouTube estén compuestas solo por números como este: 12345678901 . Estoy escribiendo una expresión para validar una cadena que es una identificación de video de YouTube. Aquí hay una versión simplificada de la expresión en acción (fuente aquí para una mayor depuración):
const foo = /((http?(?:s)?:?\/\/)?(www\.)?)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?&v=))((?:\w|-){11})((?:\&|\?)\S*)?|(?:^(\w|-){11}$)|(?:\w|-){11}$/; let bar = "dQw4w9WgXcQ" // logs true console.log("is valid: " + foo.test(bar)); ¿Es posible escribir una expresión regular que coincida con una cadena que no solo contenga números o letras ?
Estos deberían funcionar:
Pero estos no deberían:
Usó una búsqueda anticipada negativa para verificar si no son todos los números, luego siguió una verificación si son todos los caracteres de palabras y un patrón de solo guiones.
/^(?!\d+$)[\w\-]+$/ let valids = [ 'abcdefghijk', 'ecK3EnyGD8o', '1s3get2-3ds', '4bc2qfs2wrf', '28yq389gfwg', '3oyh8pw489p' ]; let invalids = [ '12345678910', '18974107892351240891751928347819234', 'Stack Overflow', 'kjsad;kflj;klasdfkjalk;sdfjlkas', '!&$@#)&&()%&*(#@$&(' ]; let pattern = /^(?!\d+$)[\w\-]+$/; for (var i = 0; i < valids.length; i++) console.log(valids[i], pattern.test(valids[i])) for (var i = 0; i < invalids.length; i++) console.log(invalids[i], pattern.test(invalids[i]))Usar
^[\d_-]*[a-zA-Z][-\w]*$Ver prueba de expresiones regulares .
EXPLICACIÓN
| parte de la expresión | Que hace |
|---|---|
^ | el comienzo de la cadena |
[\d_-]* | cualquier carácter de: dígitos ( 0-9 ), _ , - (0 o más veces (coincidiendo con la mayor cantidad posible)) |
[a-zA-Z] | cualquier caracter de: az , AZ |
[-\w]* | cualquier carácter de: - caracteres de palabras ( az , AZ , 0-9 , _ ) (0 o más veces (coincidiendo con la mayor cantidad posible)) |
$ | antes de un \n opcional, y el final de la cadena |
Código JavaScript :
const oks = [ 'abcdefghijk', 'ecK3EnyGD8o', '1s3get2-3ds', '4bc2qfs2wrf', '28yq389gfwg', '3oyh8pw489p' ]; const nonoks = [ '12345678910', '18974107892351240891751928347819234', 'Stack Overflow', 'kjsad;kflj;klasdfkjalk;sdfjlkas', '!&$@#)&&()%&*(#@$&(' ]; const regex = /^[\d_-]*[a-zA-Z][-\w]*$/; for (const i of oks) console.log(i, regex.test(i)) for (const i of nonoks) console.log(i, regex.test(i))Pruébate esto para ver el tamaño:
const re = /[\w]*(\p{L}\d|\d\p{L})[\w]*/u; console.log("abcdefghijk".match( re ) || "Failed"); console.log("ecK3EnyGD8o".match( re ) || "Failed"); console.log("1s3get2-3ds".match( re ) || "Failed"); console.log("4bc2qfs2wrf".match( re ) || "Failed"); console.log("28yq389gfwg".match( re ) || "Failed"); console.log("3oyh8pw489p".match( re ) || "Failed"); console.log("12345678910".match( re ) || "Failed"); console.log("18974107892351240891751928347819234".match( re ) || "Failed"); console.log("Stack Overflow".match( re ) || "Failed"); console.log("kjsad;kflj;klasdfkjalk;sdfjlkas".match( re ) || "Failed"); console.log("!&$@#)&&()%&*(#@$&(".match( re ) || "Failed");Querías que "abcdefghijk" fuera un caso fallido, ¿verdad? Solo contiene letras.
"1s3get2-3ds" fallará porque contiene un guión. Si desea considerar símbolos válidos, simplemente agréguelos a "[\w]", así para el guión: [-\w]