使用Puppeteer过滤目录文件时regex.match匹配失效如何解决
问题原因及解决方法
核心错误点
- 正则创建错误:你当前代码中
regex是普通字符串类型,并非正则表达式对象,无法执行正则相关的匹配操作。正则字面量不需要包裹引号,如果你需要拼接变量生成正则,要使用RegExp构造函数创建。 - 匹配逻辑错误:
match()是字符串实例的方法,正确调用逻辑是待匹配字符串.match(正则规则),你当前的regex.match()写法完全不符合API要求,且没有传入要匹配的文件名参数。
疑问解答
是否应该用
test方法替代match?
是的,仅需要判断是否符合匹配规则的场景下,RegExp.test()方法直接返回布尔值,性能优于match,也不需要额外判断match返回的结果是否为null,更适合filter的筛选逻辑。包含变量的正则如何创建?
使用RegExp构造函数即可,第一个参数传入正则规则的字符串内容(不需要加首尾的/分隔符),第二个参数传入正则修饰符(如忽略大小写的i等,无特殊需求可省略)。
修正后的完整代码
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); // 用RegExp构造函数创建正则对象,注意规则字符串不需要加首尾的/ let regex = new RegExp(`^(${title} - ${artist}(?: \\([0-9]+\\))?\\.mp3(?:\\.crdownload?)?)$`); console.log(regex); fs.readdirSync(path) .filter(f => { // 用test方法判断文件名是否匹配 return regex.test(f); }) .map(f => { console.log(f); }); })();
补充说明
原正则规则里的.匹配符如果是要匹配真实的.字符,需要转义为\\.,上面的修正代码里已经做了处理,避免.匹配到任意字符导致规则超出预期。
内容的提问来源于stack exchange,提问作者regan
相关产品推荐
相关产品推荐

