如何实现多字符串文本流搜索并在匹配到目标后提前终止
代码修改方案
问题A:同时搜索多个目标字符串实现
你可以将原函数的入参从单个搜索词改为搜索词数组,构造正则时用|拼接多个匹配规则即可,同时建议增加正则特殊字符转义逻辑,避免搜索词包含正则元字符(比如./*+等)时匹配异常。
修改后的单函数多关键词搜索代码如下:
const fs = require('fs'); const stream = require('stream'); const readline = require('readline'); // 正则特殊字符转义工具函数 const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const searchStream = (filename, searchTexts) => { // 支持传入单个字符串或者字符串数组 const textArr = Array.isArray(searchTexts) ? searchTexts : [searchTexts]; const regPattern = textArr.map(escapeRegExp).join('|'); return new Promise((resolve) => { const inStream = fs.createReadStream(`${filename}.txt`); const outStream = new stream.PassThrough(); const rl = readline.createInterface(inStream, outStream); const result = []; const regEx = new RegExp(regPattern, "i") rl.on('line', function (line) { if (line && line.search(regEx) >= 0) { result.push(line) } }); rl.on('close', function () { console.log('finished search', result) resolve(result) }); }) } // 调用示例,同时搜索三个关键词 searchStream('base_output', [str1, str2, str3]).then(res => { // 后续处理逻辑 });
问题B:匹配即终止+顺序搜索+结果写入文件实现
需要做三个改造:
- 搜索逻辑中匹配到第一个符合条件的行后直接终止读取流,不用读完整个文件
- 用async/await控制执行顺序,确保上一个关键词搜索完成后再执行下一个
- 所有关键词搜索完成后,将结果写入目标文本文件
完整实现代码如下:
const fs = require('fs'); const stream = require('stream'); const readline = require('readline'); const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // 改造后的搜索函数:匹配到第一个结果就终止 const searchSingleKeyword = (filename, keyword) => { return new Promise((resolve) => { const inStream = fs.createReadStream(`${filename}.txt`); const outStream = new stream.PassThrough(); const rl = readline.createInterface(inStream, outStream); let matchedLine = null; const regEx = new RegExp(escapeRegExp(keyword), "i") rl.on('line', function (line) { if (line && line.search(regEx) >= 0) { matchedLine = line; // 匹配到就关闭流,触发close事件 rl.close(); // 销毁读流,避免资源占用 inStream.destroy(); } }); rl.on('close', function () { console.log(`搜索关键词「${keyword}」完成,匹配结果:${matchedLine ?? '无匹配'}`) resolve({keyword, matched: matchedLine}) }); }) } // 顺序执行搜索+写入文件的主逻辑 const batchSearchAndWrite = async (sourceFile, keywordList, outputFile) => { const result = []; for (const kw of keywordList) { const searchRes = await searchSingleKeyword(sourceFile, kw); if (searchRes.matched) { result.push(searchRes.matched); } } // 结果写入目标文件,每行一条匹配内容 fs.writeFile(outputFile, result.join('\n'), 'utf-8', () => { console.log('所有搜索完成,结果已写入文件'); }); } // 调用示例 const str1 = '你的关键词1', str2 = '你的关键词2', str3 = '你的关键词3'; batchSearchAndWrite('base_output', [str1, str2, str3], 'search_result.txt');
内容的提问来源于stack exchange,提问作者Hje282
相关产品推荐
相关产品推荐

