Tengo problemas con regex.match que no coincide con los nombres de archivo que sí coinciden cuando los pruebo individualmente en un verificador en línea https://regex101.com
¿Alguien puede detectar el problema en el código a continuación?
P: ¿Debería usar expresiones regulares? prueba en lugar de partido? En caso afirmativo, ¿cómo creo la expresión regular cuando contiene variables?
Debe coincidir con todos los archivos que comienzan con: ES_(Stay) True - Lars Eriksson
Lista de archivos y directorios en la ruta encontrada por fs.readdirSync:
.DS_Store ES_(Stay) True - Lars Eriksson (22).mp3 ES_(Stay) True - Lars Eriksson (22).mp3.crdownload ES_(Stay) True - Lars Eriksson.mp3 ES_(Stay) True - Lars Eriksson.mp3.crdownload Other - File (22).mp3 Other - File (22).mp3.crdownload Other - File.crdownload Other - File.mp3 originalsLa expresión regular se convierte en:
/^(ES_\(Stay\) True - Lars Eriksson(?: \([0-9]+\))?.mp3(?:.crdownload?)?)$/Guión de titiritero:
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { function escapeRegex(string) { return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } let path = '/path/to/files/'; let title = 'ES_(Stay) True'; let artist = 'Lars Eriksson'; title = escapeRegex(title); artist = escapeRegex(artist); let regex = `/^(${title} - ${artist}(?: \\([0-9]+\\))?\.mp3(?:\.crdownload?)?)$/`; console.log(regex); fs.readdirSync(path) .filter(f => { regex.match(); }) .map(f => { console.log(f); }); })();Creo que para convertir una cadena a expresiones regulares, debe usar RegExp() , no solo usarlo como cadena, por ejemplo
let regex = new RegExp(`^(${title} - ${artist}(?: \\([0-9]+\\))?\.mp3(?:\.crdownload?)?)$`, 'gi'); console.log(regex);regex.match() ¿qué esperas que coincida cuando no hay nada que coincida? Estás tratando de hacer coincidir la expresión regular con nada que debería ser f.match(regex)tu codigo deberia ser asi
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { function escapeRegex(string) { return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } let path = '/path/to/files/'; let title = 'ES_(Stay) True'; let artist = 'Lars Eriksson'; title = escapeRegex(title); artist = escapeRegex(artist); let regex = new RegExp(`^(${title} - ${artist}(?: \\([0-9]+\\))?\.mp3(?:\.crdownload?)?)$`, 'gi'); console.log(regex); let file = fs.readdirSync(path), matched = file.filter(f => f.match(regex)) console.log(matched) })();Resultado
0: "ES_(Stay) True - Lars Eriksson (22).mp3" 1: "ES_(Stay) True - Lars Eriksson (22).mp3.crdownload" 2: "ES_(Stay) True - Lars Eriksson.mp3" 3: "ES_(Stay) True - Lars Eriksson.mp3.crdownload"