如何用正则表达式替换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
相关产品推荐
相关产品推荐

