Tengo un problema con mi expresión regular. No sé por qué, es realmente extraño, pero obtengo un gran resultado con console.log y no con mi condición.
Este es mi código:
const regEx = new RegExp("((?=.*[AZ])(?=.*[az])(?=.*[0-9])(?=.*[!\"#$%&'()*+,-./:;<=>?@[\\]^_\`{|}~]).{"+k+"})", 'g'); let possibilities = 0; for(let i = 0; i < string.length; i++){ if(string.length<i+k) break; const s = string.slice(i, i+k); console.log(regEx.test(s), s) if(regEx.test(s)) possibilities++; } return possibilities;
function count(n, k, string) { const regEx = new RegExp("((?=.*[AZ])(?=.*[az])(?=.*[0-9])(?=.*[!\"#$%&'()*+,-./:;<=>?@[\\]^_\`{|}~]).{"+k+"})", 'g'); let possibilities = 0; for(let i = 0; i < string.length; i++){ if(string.length<i+k) break; const s = string.slice(i, i+k); console.log(regEx.test(s), s) if(regEx.test(s)) possibilities++; } return possibilities; } console.log(count(30,6,"G=d:Dl:T=9NS1c$9qC%,^EdUVLnU-7"))
En mi función, obtengo 0 posibilidades, mientras que debería recibir 11. Y cuando cuento los valores true
de consoles.log, obtengo 11... ¿Sabes por qué tengo este problema y cómo puedo resolverlo? ?
Y, cuando pruebo toda la cadena en regexr, funciona...
Cuando estás haciendo console.log(regEx.test(s), s)
estás consumiendo el RegEx una vez y mueves un cursor interno o algo así.
Debe crear el new RegExp
dentro del alcance del bucle, por lo que su cursor se colocará nuevamente al principio y no se consumirá en cada iteración.
Además, es posible que desee almacenar el resultado en una variable si desea utilizarlo dos veces o más:
function count(n, k, string) { let possibilities = 0; for(let i = 0; i < string.length; i++){ const regEx = new RegExp("((?=.*[AZ])(?=.*[az])(?=.*[0-9])(?=.*[!\"#$%&'()*+,-./:;<=>?@[\\]^_\`{|}~]).{"+k+"})", 'g'); if(string.length<i+k) break; const s = string.slice(i, i+k); const regexResult = regEx.test(s); console.log(regexResult, s) if(regexResult) possibilities++; } return possibilities; } console.log(count(30,6,"G=d:Dl:T=9NS1c$9qC%,^EdUVLnU-7"))