JavaScript/TS读取.md文件应用正则匹配返回null问题求助
问题原因
- 代码存在多处拼写、参数、返回值错误:
- 封装的
readFile函数形参定义为fileName,内部调用fs读取时传入的是未定义的filePath变量,无法正确读取目标文件 readMD函数仅调用了readFile但没有返回读取到的文本内容,调用方拿到的返回值是undefined- 调用读取方法时错写为
readME,和定义的readMD函数名不匹配;后续变量名混用changeLog/changelog/final,逻辑链路本身就拿不到正确的文件内容
- 封装的
- 换行符兼容问题:正则硬编码
\n作为换行匹配规则,Windows系统下文件默认使用\r\n(CRLF)作为换行符,会导致换行匹配逻辑失效 - 文件BOM问题:如果md文件以UTF-8带BOM格式保存,文件开头会存在不可见的
\uFEFF字符,正则的^##规则无法匹配到被BOM占用的开头位置,直接返回null
解决方法
- 先修复所有基础代码错误,修正参数名、函数名、返回值,同时在读取阶段统一处理BOM和换行符问题:
import fs from 'fs'; import { promisify } from 'util'; // 统一参数名 const readFile = async (filePath: string) => { return promisify(fs.readFile)(filePath, 'utf8'); } const readMD = async (filePath: string) => { const rawText = await readFile(filePath); // 移除开头BOM,统一替换所有CRLF换行为LF,从根源解决换行和BOM匹配问题 return rawText.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n'); }
- 修正调用逻辑的拼写错误,统一变量名,原有正则不需要修改即可正常运行:
// 修正函数名拼写 const changeLog = await readMD(changeLogPath); const result = changeLog.match(/^##.*\n([^#]*)/m); if (result) { // 去除匹配结果前后多余空行 console.log(result[1].trim()); }
运行后即可得到预期输出:
* 11asdf asdf * 11asdfadf
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

