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 originals
La 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"