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

如何用正则表达式替换SVG文件中stroke属性的rgb值?

搞定SVG批量替换stroke的RGB值问题

嘿,我来帮你解决这个问题!你遇到的核心问题是正则里特殊字符的转义,加上C#字符串的转义规则,还有几个容易踩的小坑,咱们一步步理清楚:

首先说转义的事儿

正则里的(和)是用来定义捕获组的特殊元字符,要匹配SVG里字面意义的括号,必须用\转义它们。但在C#的普通字符串里,\本身是转义字符,所以你要么写两个\\来表示一个正则里的\,要么用逐字字符串(在字符串前加@),这样里面的\不需要额外转义,写起来更省心。

然后要避免贪婪匹配的坑

你原来用的.*是贪婪模式,会尽可能多的匹配字符,比如如果SVG里有多个stroke="rgb(...)",它可能会从第一个(一直匹配到最后一个),把中间的所有内容都吞进去,导致替换出错。所以咱们换成[^)]*,它表示只匹配除了)之外的任意字符,这样就只会精准匹配当前rgb括号里的数值。

还有一个容易忽略的细节

你原来的代码里,Regex.Replace的结果没有赋值回svgText!Regex.Replace是返回一个新的字符串,不会修改原字符串,所以这一步一定要补上,不然替换等于白做。

最终的正确代码

推荐用逐字字符串(可读性更高)

string svgPath = "你的SVG文件路径";
string svgText = File.ReadAllText(svgPath);
// 逐字字符串里,直接写\(和\)来匹配字面括号,[^)]*限制匹配范围
svgText = Regex.Replace(svgText, @"stroke=""rgb\([^)]*\)""", "stroke=\"rgb(100,100,100)\"");
File.WriteAllText(svgPath, svgText);

用普通字符串的写法(需要双重转义)

如果你不想用逐字字符串,就得把正则里的\写成\\:

string svgPath = "你的SVG文件路径";
string svgText = File.ReadAllText(svgPath);
svgText = Regex.Replace(svgText, "stroke=\"rgb\\([^)]*\\)\"", "stroke=\"rgb(100,100,100)\"");
File.WriteAllText(svgPath, svgText);

这样跑起来就能把所有stroke="rgb(xxx,xxx,xxx)"都替换成你想要的固定RGB值啦!

内容的提问来源于stack exchange,提问作者E. A. Bagby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:55:51