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

Java中剔除Markup标记(保留代码段)的Regex方案咨询

标记剔除方案

优先推荐分两步处理的方案,逻辑简单兼容性强

不用强行用单个正则处理所有场景,拆分步骤后实现难度会低很多:

  1. 第一步先隔离行内代码块:
    用正则 `([^`]*)` 匹配所有行内代码,把捕获到的代码内容存入临时数组,原位置替换为类似{{CODE_序号}}的唯一占位符,这一步之后剩下的文本里就没有反引号了,不需要再考虑跳过代码块的问题。
  2. 第二步迭代剥离格式标记:
    按「长标记优先」的顺序,循环执行以下替换,直到没有可匹配的标记为止:
    • 替换粗体:正则\*\*(.*?)\*\* 替换为$1
    • 替换斜体:正则_(.*?)_ 替换为$1
    • 替换删除线:正则~(.*?)~ 替换为$1
      迭代运行天然支持嵌套标记,比如**_粗斜文本_**第一次会被处理为_粗斜文本_,第二次处理为粗斜文本,完全适配复合场景。
  3. 第三步把占位符替换回原本的代码内容即可。

如果需要简化正则单次/迭代匹配的方案

你可以用以下简化后的正则,不需要原来复杂的预查逻辑,迭代运行即可:

(\*\*|_|~)(.*?)\1(?=(?:[^`]*`[^`]*`)*[^`]*$)

替换规则为$2,核心逻辑说明:

  • 前半部分(\*\*|_|~)(.*?)\1匹配成对的粗体、斜体、删除线标记,捕获中间的文本内容
  • 后半部分(?=(?:[^][^])*[^]*$)`是正向预查,校验当前位置之后的反引号数量为偶数,保证匹配的标记不在行内代码块内部
  • 多次运行直到没有匹配结果,就能处理所有嵌套的复合标记场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:24:03