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

正则表达式匹配含HTML标签与换行的Markdown内容遇问题求助

问题分析

你的正则表达式/\*([\w\s]+|<.+>)\*/g匹配失败的核心原因有两个:

  1. 分支互斥限制:正则用|分隔了两个独立分支,要么匹配纯文本([\w\s]+,包含字母、数字、下划线和空白),要么匹配单个转义HTML标签(<.+>),但无法处理「标签+文本+换行」混合的内容。
  2. 换行匹配问题:.+默认不匹配换行符(JavaScript中dotAll模式默认关闭),所以即使分支允许,<.+>也无法覆盖包含换行的标签内容。

解决方案

修改正则,让它能匹配任意字符(包括换行),同时支持混合内容,并且用非贪婪量词避免过度匹配:

const regex = /\*([\s\S]*?)\*/g;

为什么这样改?

  • [\s\S]:\s匹配所有空白字符(包括换行、空格、制表符等),\S匹配所有非空白字符,两者组合就能覆盖任意字符,完美解决换行匹配问题。
  • *?:非贪婪量词,会尽可能少地匹配字符,确保匹配到最近的结束*,避免把多个加粗块(比如*text1* and *text2*)当成一个整体匹配。

测试验证

用你的测试案例验证:

const testStr = '*<b>words\nmore words</b>*';
const regex = /\*([\s\S]*?)\*/g;
console.log(testStr.match(regex)); 
// 输出: ["*<b>words\nmore words</b>*"]

可选优化(处理转义星号)

如果你的场景需要支持转义星号(比如\*表示字面量*,不触发加粗),可以给正则加上负向前瞻/后顾,避免匹配转义的星号:

const regex = /\*(?!\\)([\s\S]*?)(?<!\\)\*/g;

这个版本会跳过像\*escaped*这样的内容,只匹配未转义的*包裹的块。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:00