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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:33:33