Dart正则匹配中如何处理闭括号?含内部括号的Quote标签匹配
Dart正则匹配带括号的quote标签并捕获内容
问题解决正则
针对你的需求,这里提供能正确处理所有示例的正则表达式,适配Dart环境:
RegExp quoteRegex = RegExp(r'\[quote(?:=([\'"])([\s\S]*?)\1|=([^\]]*)|)\]|\[\/quote\]');
正则逻辑拆解
这个正则通过分支处理三种[quote...]的情况,同时避免内容中出现]导致的匹配中断:
\[quote:匹配标签起始的[quote- 非捕获组
(?:...)包含三种分支:=([\'"])([\s\S]*?)\1:处理带单/双引号的赋值场景([\'"]):捕获引号类型(单/双),作为后续匹配终止的标记([\s\S]*?):捕获引号内的所有内容(包括]、[等特殊字符),非贪婪匹配直到遇到相同类型的引号\1:引用第一个捕获组的引号,确保匹配到对应的闭合引号
|=([^\]]*):处理不带引号的赋值场景,捕获=到]之间的所有内容(内容不含])|):处理无赋值的纯[quote]标签
\]:匹配标签的闭合]|\[\/quote\]:匹配结束标签[/quote]
捕获内容提取
由于正则有多个捕获组,提取内容时按优先级判断:
- 若
match.group(2)不为空:是带引号的捕获内容 - 若
match.group(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
相关产品推荐
相关产品推荐

