C#正则表达式中出现[]未终止集合错误
解决正则匹配{{...}}时的“[]未终止集合”错误
这个错误大概率是你写正则的时候踩了两个常见坑之一:要么没转义{}这两个特殊字符,要么错误地把它们放进了方括号[]里,导致正则引擎解析时认为字符集没闭合。
先搞懂错误根源
正则里的{和}是特殊字符,用来表示量词(比如{3}匹配3次,{1,5}匹配1到5次),如果直接写{{,引擎会误以为你要定义量词,直接报错;要是你错误写成[{{(.*?)}}]这种形式,方括号里的语法混乱,就会触发“未终止集合”的错误。
正确的正则写法
要匹配{{和}}之间的任意内容,核心是转义{和},再结合非贪婪匹配避免匹配过多内容:
1. 匹配不含换行的内容(最常用场景)
正则表达式:
\{\{(.*?)\}\}
\{\{:转义后匹配字面量的{{(.*?):非贪婪匹配任意字符(除换行),括号用来捕获中间的内容\}\}:转义后匹配字面量的}}- 加上
g标志可以全局匹配所有符合的片段
2. 匹配包含换行的内容
如果要匹配跨多行的内容,需要开启“单行模式”(不同语言写法略有不同):
- JavaScript:加上
s标志,正则变成/\{\{(.*?)\}\}/gs - Python:用
re.DOTALL参数,编译正则时写re.compile(r'\{\{(.*?)\}\}', re.DOTALL)
举两个实际代码例子
JavaScript 示例
const targetText = "欢迎{{用户名}},你的等级是{{Lv.10}},个性签名:{{热爱编程\n喜欢摸鱼}}"; // 匹配含换行的内容,用gs标志 const regex = /\{\{(.*?)\}\}/gs; let result; while ((result = regex.exec(targetText)) !== null) { console.log("捕获到的内容:", result[1].trim()); } // 输出:用户名、Lv.10、热爱编程\n喜欢摸鱼
Python 示例
import re text = "订单号:{{20240518001}}\n备注:{{加急,需今日送达}}" # 开启DOTALL模式匹配换行 pattern = re.compile(r'\{\{(.*?)\}\}', re.DOTALL) matches = pattern.findall(text) for match in matches: print("提取到的内容:", match.strip()) # 输出:20240518001、加急,需今日送达
额外提醒
如果你的目标内容里可能出现}}(比如{{内容里有}}符号}}),非贪婪匹配会提前终止,这时候可以调整正则为\{\{([\s\S]*?)\}\}(用[\s\S]匹配任意字符,包括换行,替代.),效果和单行模式类似,但兼容性更好。
内容的提问来源于stack exchange,提问作者weirdgyn
相关产品推荐
相关产品推荐

