Go开发Markdown转HTML解析器时H1正则替换结果异常如何解决
问题排查及修复方案
换行符导致的显示异常
你的输入文本大概率是Windows格式,换行符为\r\n。默认情况下正则的.不匹配换行符,所以(.*)会捕获到\r为止,得到的捕获组内容为Hello World!\r。
替换后的完整字符串实际为<h1> Hello World!\r</h1>,输出时\r会将光标移到当前行的开头,后续的</h1>就会覆盖行首的<h1>内容,最终呈现出你看到的异常输出。正则规则不完善
你的正则没有匹配#和标题内容之间的空格,会导致捕获的标题开头多一个冗余空格,同时默认的^只会匹配整个字符串的开头,如果你有多行Markdown内容,其他行的一级标题无法被识别。
修复后的代码
content, readErr := ioutil.ReadFile(markdownFile) contentString := string(content) // 加(?m)开启多行模式,匹配#后至少一个空白字符再捕获标题内容 h1 := regexp.MustCompile(`(?m)^#\s+(.*?)\s*$`) contentHTML := h1.ReplaceAllString(contentString, `<h1>$1</h1>`) fmt.Println(contentHTML)
说明:
(?m)开启多行匹配模式,让^可以匹配每一行的开头,$匹配每一行的结尾\s+匹配#后的一个或多个空格/制表符(.*?)非贪婪捕获标题内容\s*$匹配行尾的所有空白字符(包括\r),避免捕获到冗余的换行符
如果你不想修改正则,也可以在读取文件后先统一处理换行符,把所有\r\n替换为\n再做正则替换,也能解决这个问题。
内容的提问来源于stack exchange,提问作者Jed Denb
相关产品推荐
相关产品推荐

