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

Dart正则匹配中如何处理闭括号?含内部括号的Quote标签匹配

Dart正则匹配带括号的quote标签并捕获内容

问题解决正则

针对你的需求,这里提供能正确处理所有示例的正则表达式,适配Dart环境:

RegExp quoteRegex = RegExp(r'\[quote(?:=([\'"])([\s\S]*?)\1|=([^\]]*)|)\]|\[\/quote\]');

正则逻辑拆解

这个正则通过分支处理三种[quote...]的情况,同时避免内容中出现]导致的匹配中断:

  • \[quote:匹配标签起始的[quote
  • 非捕获组(?:...)包含三种分支:
    1. =([\'"])([\s\S]*?)\1:处理带单/双引号的赋值场景
      • ([\'"]):捕获引号类型(单/双),作为后续匹配终止的标记
      • ([\s\S]*?):捕获引号内的所有内容(包括]、[等特殊字符),非贪婪匹配直到遇到相同类型的引号
      • \1:引用第一个捕获组的引号,确保匹配到对应的闭合引号
    2. |=([^\]]*):处理不带引号的赋值场景,捕获=到]之间的所有内容(内容不含])
    3. |):处理无赋值的纯[quote]标签
  • \]:匹配标签的闭合]
  • |\[\/quote\]:匹配结束标签[/quote]

捕获内容提取

由于正则有多个捕获组,提取内容时按优先级判断:

  1. 若match.group(2)不为空:是带引号的捕获内容
  2. 若match.group(3)不为空:是不带引号的捕获内容
  3. 若两者都为空:是无内容的[quote]标签

Dart代码示例

void main() {
  List<String> testCases = [
    "[quote=John]abc[/quote]",
    '[quote="John"]abc[/quote]',
    "[quote='John']abc[/quote]",
    "[quote='Joh]n']abc[/quote]",
    "[quote='Joh[]n']abc[/quote]",
    "[quote]abc[/quote]",
  ];

  RegExp quoteRegex = RegExp(r'\[quote(?:=([\'"])([\s\S]*?)\1|=([^\]]*)|)\]|\[\/quote\]');

  for (String caseStr in testCases) {
    print("测试用例: $caseStr");
    for (Match match in quoteRegex.allMatches(caseStr)) {
      String matchedTag = match[0]!;
      if (matchedTag == "[/quote]") {
        print("  匹配到结束标签: $matchedTag");
      } else {
        String? content = match.group(2) ?? match.group(3);
        print("  匹配到开始标签: $matchedTag,捕获内容: ${content ?? '无'}");
      }
    }
    print("---");
  }
}

输出结果

测试用例: [quote=John]abc[/quote]
  匹配到开始标签: [quote=John],捕获内容: John
  匹配到结束标签: [/quote]
---
测试用例: [quote="John"]abc[/quote]
  匹配到开始标签: [quote="John"],捕获内容: John
  匹配到结束标签: [/quote]
---
测试用例: [quote='John']abc[/quote]
  匹配到开始标签: [quote='John'],捕获内容: John
  匹配到结束标签: [/quote]
---
测试用例: [quote='Joh]n']abc[/quote]
  匹配到开始标签: [quote='Joh]n'],捕获内容: Joh]n
  匹配到结束标签: [/quote]
---
测试用例: [quote='Joh[]n']abc[/quote]
  匹配到开始标签: [quote='Joh[]n'],捕获内容: Joh[]n
  匹配到结束标签: [/quote]
---
测试用例: [quote]abc[/quote]
  匹配到开始标签: [quote],捕获内容: 无
  匹配到结束标签: [/quote]
---

原正则问题分析

你之前的正则\[quote[=]?["]?([\s\S]*?)["]?\]|\[\/quote\]失效的原因是:
([\s\S]*?)是贪婪程度最低的匹配,遇到第一个可以满足后续["]?\]的字符就会停止。当内容中包含]时,这个]会被后续的\]匹配,导致捕获内容提前截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:07