该不该用正则取决于文本结构:简单、无嵌套、边界明确时可用;涉及语法状态、层级嵌套或上下文依赖时应换专用解析器,如markdown用flexmark-java,html用jsoup,json用jackson。

用正则处理字符串,不是“能不能”,而是“该不该”。当文本结构简单、边界明确、无嵌套且输入可控时,正则高效直接;一旦涉及语法状态、层级嵌套或上下文依赖,它就容易失效——这时候该换解析器了。
Markdown 这类轻量标记语言不适合纯正则
像 **bold *italic*** 或 `code **inside` 这类嵌套结构,正则无法可靠识别闭合位置。它没有“栈”概念,不能记住当前是否在代码块内、强调标签是否已配对。实际中常见问题包括:
- 强调标签未闭合,生成 HTML 缺少
- 反斜杠转义被忽略,
*not bold*被误渲染 - 连续换行、列表缩进与段落混排时,匹配范围错位
推荐改用 commonmark-java 或 flexmark-java:它们基于 AST 构建,能准确建模文档结构,支持扩展(如表格、脚注),也内置 XSS 防护选项。
HTML/XML 解析必须脱离正则
用正则提取 <p>hello</p> 看似可行,但遇到 <div><p>nested</p></div> 或含属性的 @#@#@#@#@#@#@#@#@#@0 就会崩。正则无法处理任意深度嵌套和引号转义逻辑。
应使用标准解析器:
- Java:用
Jsoup(适合 HTML 清洗与抽取)或javax.xml.parsers.DocumentBuilder(严格 XML) - 不自行写
replaceAll("<p>(.*?)</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/ai/1674" title="Soofy"><img src="https://img.php.cn/upload/ai_manual/000/969/633/68b6d5bd639c9662.png" alt="Soofy" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/ai/1674" title="Soofy" class="overflowclass">Soofy</a> <p class="overflowclass">一款通过AI对话帮助用户学习语言的在线学习工具,将语言练习融入真实交流场景。</p> </div> <a rel="nofollow" href="/ai/1674" title="Soofy" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>", "$1")类规则——它在<p>abc</p> <p>def</p>上可能跨标签捕获
配置文件或协议数据建议用专用解析器
JSON、YAML、INI、TOML 等格式表面是文本,实为有明确定义语义的结构化数据。正则可临时提取单个字段(如 "version": "1.2.3"),但无法验证嵌套对象合法性、类型一致性或注释位置有效性。
对应方案更稳妥:
- JSON →
jackson-databind或gson - YAML →
snakeyaml - TOML →
toml4j
这些库能报出具体错误位置(如 “line 42, column 5: expected ‘=’ but got ‘:’”),而正则失败只留下空结果或错乱字符串。
简单替换场景仍可保留正则,但要守好三条线
若仅处理内部系统短文本(如日志摘要、字段标签),且满足以下条件,正则依然实用:
- 输入完全受控:禁止嵌套、不允许多行、不支持转义或混合格式
- 只做单层行内转换:如
**text** → <strong>text</strong>,跳过**a *b* c** - 严格按顺序执行:先清理转义(
\*→*),再处理代码片段(`x`),最后处理强调/链接,避免中间态污染
这种用法是权衡后的取舍,不是通用解法。










