Java中剔除Markup标记(保留代码段)的Regex方案咨询
标记剔除方案
优先推荐分两步处理的方案,逻辑简单兼容性强
不用强行用单个正则处理所有场景,拆分步骤后实现难度会低很多:
- 第一步先隔离行内代码块:
用正则`([^`]*)`匹配所有行内代码,把捕获到的代码内容存入临时数组,原位置替换为类似{{CODE_序号}}的唯一占位符,这一步之后剩下的文本里就没有反引号了,不需要再考虑跳过代码块的问题。 - 第二步迭代剥离格式标记:
按「长标记优先」的顺序,循环执行以下替换,直到没有可匹配的标记为止:- 替换粗体:正则
\*\*(.*?)\*\*替换为$1 - 替换斜体:正则
_(.*?)_替换为$1 - 替换删除线:正则
~(.*?)~替换为$1
迭代运行天然支持嵌套标记,比如**_粗斜文本_**第一次会被处理为_粗斜文本_,第二次处理为粗斜文本,完全适配复合场景。
- 替换粗体:正则
- 第三步把占位符替换回原本的代码内容即可。
如果需要简化正则单次/迭代匹配的方案
你可以用以下简化后的正则,不需要原来复杂的预查逻辑,迭代运行即可:
(\*\*|_|~)(.*?)\1(?=(?:[^`]*`[^`]*`)*[^`]*$)
替换规则为$2,核心逻辑说明:
- 前半部分
(\*\*|_|~)(.*?)\1匹配成对的粗体、斜体、删除线标记,捕获中间的文本内容 - 后半部分
(?=(?:[^][^])*[^]*$)`是正向预查,校验当前位置之后的反引号数量为偶数,保证匹配的标记不在行内代码块内部 - 多次运行直到没有匹配结果,就能处理所有嵌套的复合标记场景
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

