Estoy tratando de eliminar una marca de tiempo (con formato de números y guiones) de una cadena. En el proceso, experimenté con RegExp global. Se me ocurrió el siguiente código:
for(let filename of ["123-123_aaa_bbb_ccc","aaa_bbb_ccc_129-999"]) { let s=filename.split("_") let globalRegex = new RegExp('^\d+\-\d+$', 'g'); for(let si of s){ if(globalRegex.test(si)) break } console.log(`match found at: `,globalRegex.lastIndex) }que devuelve:
match found at: 0 match found at: 0Mis preguntas son:
Hay bastantes problemas aquí:
0 s porque su expresión regular no coincide, y no coincide porque definió la cadena de expresión regular dentro de una cadena literal normal, por lo tanto, pierde todas las barras invertidas individuales. El patrón debe establecerse con un literal regex, let globalRegex = /^\d+\-\d+$/; (vea ¿Por qué esta expresión regular de javascript no funciona? ). Tenga en cuenta la ausencia de la bandera g , si la usa con RegExp#test() , no debe usar la bandera g para evitar problemas (vea ¿Por qué una RegExp con bandera global da resultados incorrectos? ).0 s como salida porque una expresión regular /^\d+\-\d+$/ puede y solo coincidirá al comienzo de la cadena (Índice = 0). Parece que desea obtener los ID de las "palabras" o "tokens" en la cadena, por lo que debe contarlos.Por lo tanto, podría volver a escribir el código como
for(let filename of ["123-123_aaa_bbb_ccc","aaa_bbb_ccc_129-999"]) { let result = -1; let s=filename.split("_") let globalRegex = /^\d+\-\d+$/; for (const [index, si] of s.entries()) { if(globalRegex.test(si)) { result = index break } } console.log(`match found at: `, result) }