单层级嵌套标签检测正则表达式优化求助
单层级嵌套标签的正则解决方案
问题分析
你当前需要支持最多1层级嵌套的标签匹配,既要兼容原有S/C/A/R类型标签(包括A类型的斜杠分隔选项),又要避免之前两种正则方案的缺陷:
- 第一种方案仅支持单个嵌套标签,且对包含嵌套的A类型标签捕获不全
- 第二种方案因贪婪匹配,在多标签共存时会错误合并多个标签
解决方案正则
/{{((?:[^{}]|{{[^{}]*}})+)::([SCRA])}}/g
正则结构说明
/{{:匹配标签起始标识((?:[^{}]|{{[^{}]*}})+):核心捕获组,负责匹配标签内容(支持1层级嵌套)[^{}]:匹配非大括号的任意字符,兼容普通文本、A类型的斜杠分隔符{{[^{}]*}}:匹配单层级嵌套标签(内部无大括号,确保最多1层嵌套)+:允许内容包含多个普通文本片段或嵌套标签
:::匹配内容与类型的分隔符([SCRA]):捕获标签类型(字符集简化写法,替代冗余的[S|C|R|A])}}:匹配标签结束标识/g:全局匹配模式
场景验证
以下标签均可被正确匹配:
- 普通S类型:
{{text to replace::S}}→ 内容:text to replace,类型:S - 含单个嵌套的C类型:
{{Include {{content::S}} here::C}}→ 内容:Include {{content::S}} here,类型:C - 含嵌套的A类型:
{{{{option1::S}} / {{option2::C}}::A}}→ 内容:{{option1::S}} / {{option2::C}},类型:A - 多个嵌套标签混合:
{{{{a::S}} and {{b::C}} and plain text::R}}→ 内容:{{a::S}} and {{b::C}} and plain text,类型:R
为什么之前的方案失效?
- 第一种方案的
[^{]+会在遇到第一个{时停止匹配,无法捕获嵌套标签之后的内容,导致A类型等包含多片段的标签匹配不全 - 第二种方案的
.+是贪婪匹配,在多标签共存时会从第一个{{一直匹配到最后一个}},错误合并多个独立标签
代码示例(JavaScript)
const tagRegex = /{{((?:[^{}]|{{[^{}]*}})+)::([SCRA])}}/g; const sourceText = ` 文档内容示例: - 替换文本:{{user name::S}} - 可选内容:{{{{show detail::C}}?::C}} - 二选一:{{{{option A::S}} / {{option B::C}}::A}} `; let matchResult; while ((matchResult = tagRegex.exec(sourceText)) !== null) { console.log(`标签:${matchResult[0]}`); console.log(`内容:${matchResult[1]}`); console.log(`类型:${matchResult[2]}\n`); }
内容的提问来源于stack exchange,提问作者Filipe Nóbrega
相关产品推荐
相关产品推荐

