仅用正则表达式将HTML转换为Jira标记的实现问询
HTML列表转Jira格式:纯Boost正则实现方案
问题背景
我用的工具没HTML解析能力,但有基于Boost库的正则替换功能,已经靠它完成了大部分格式转换,效果还凑合。现在卡在列表转换上——虽然知道用脚本遍历能搞定,但想纯靠正则解决。
已移除段落标签的输入内容:
Numbered bullet list: <ol> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ol> Standard bullet list: <ul> <li>Item A</li> <li>Item B</li> <li>Item C</li> <li>Item D</li> </ul>
期望输出的Jira格式:
Numbered bullet list: # Item 1 # Item 2 # Item 3 Standard bullet list: * Item A * Item B * Item C * Item D
解决方案
完全可以靠两次Boost正则替换搞定,不用写脚本遍历:
方法一:嵌套替换(推荐)
如果工具支持对捕获组内容做二次替换,用这种更高效:
1. 处理有序列表
启用DOTALL模式(让.匹配换行符),用以下正则匹配整个有序列表块:
(<ol>)(.*?)(<\/ol>)
对捕获到的中间部分($2,即<ol>内部的所有内容)执行替换:
- 替换正则:
<li>(.*?)<\/li> - 替换为:
# $1
最终整个<ol>...</ol>块会被替换成带#的Jira有序列表,同时自动移除<ol>标签。
2. 处理无序列表
逻辑和有序列表一致,只是标记符号换成*:
启用DOTALL模式,匹配整个无序列表块:
(<ul>)(.*?)(<\/ul>)
对中间的$2执行替换:
- 替换正则:
<li>(.*?)<\/li> - 替换为:
* $1
方法二:分步全局替换
如果工具不支持嵌套替换,拆成四步全局替换也能实现:
- 替换有序列表的
<li>项:
<ol>\s*\K<li>(.*?)<\/li>(?=\s*<\/ol>)
替换为:
# $1
(\K用来忽略前面的<ol>,正向断言确保只匹配<ol>内部的<li>)
- 删除
<ol>和</ol>标签:
<\/?ol>
替换为空字符串。
- 替换无序列表的
<li>项:
<ul>\s*\K<li>(.*?)<\/li>(?=\s*<\/ul>)
替换为:
* $1
- 删除
<ul>和</ul>标签:
<\/?ul>
替换为空字符串。
说明
Boost正则完全支持上述所有语法(\K、正向断言、DOTALL模式),只要在工具中开启对应的正则选项(比如设置boost::regex::dotall)就能完成转换,全程无需脚本遍历。
内容的提问来源于stack exchange,提问作者Gordon Mckeown
相关产品推荐
相关产品推荐

