从数据库读取正则匹配失败,本地使用正常问题排查
问题分析与解决
核心问题
数据库中存储的正则表达式是字符串类型,而本地定义的localRegex是RegExp实例对象。控制台打印看起来相等,只是因为正则对象的toString()输出和字符串形式的正则文本一致,但两者的本质类型完全不同:
typeof localRegex返回objecttypeof regex(从数据库获取的)返回string
当调用reply.match(regex)时,如果传入的是字符串,match方法会将其作为普通文本进行匹配,而非正则规则,因此匹配失败返回null,进而导致读取found.groups时抛出TypeError。
解决方法
将从数据库获取的字符串形式正则,转换为RegExp对象后再进行匹配:
const reply = "Isi seharga Rp 10.000, terima kasih."; const sql = 'SELECT regex FROM balasan WHERE nama="satu"'; db.query(sql, function (err, results) { if (err) throw err; // 将字符串正则转为RegExp对象 const regexStr = results[0].regex; const regex = new RegExp(regexStr); const found = reply.match(regex); // 用可选链避免匹配失败时的报错 console.log(found?.groups); });
注意事项
如果正则表达式中包含特殊转义字符(比如\d、\s),数据库存储时需要将反斜杠转义为双反斜杠(即存为\\d),否则读取后转换为RegExp对象时,转义效果会丢失,导致正则规则失效。
内容的提问来源于stack exchange,提问作者Yusrizal Siregar
相关产品推荐
相关产品推荐

