You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅用正则表达式将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

方法二:分步全局替换

如果工具不支持嵌套替换,拆成四步全局替换也能实现:

  1. 替换有序列表的<li>项:
<ol>\s*\K<li>(.*?)<\/li>(?=\s*<\/ol>)

替换为:

# $1

(\K用来忽略前面的<ol>,正向断言确保只匹配<ol>内部的<li>)

  1. 删除<ol>和</ol>标签:
<\/?ol>

替换为空字符串。

  1. 替换无序列表的<li>项:
<ul>\s*\K<li>(.*?)<\/li>(?=\s*<\/ul>)

替换为:

* $1
  1. 删除<ul>和</ul>标签:
<\/?ul>

替换为空字符串。

说明

Boost正则完全支持上述所有语法(\K、正向断言、DOTALL模式),只要在工具中开启对应的正则选项(比如设置boost::regex::dotall)就能完成转换,全程无需脚本遍历。

内容的提问来源于stack exchange,提问作者Gordon Mckeown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:26:19