使用正则表达式在SVG文件中查找并替换文本为'('和')'字符。

3
我希望使用正则表达式在SVG文件中替换特定文本。
例如,文件中可能有许多类似以下属性的内容:
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(150,150,150)" stroke-opacity="0.14902" stroke-width="0.425" >
<polyline points="17001.1,7859.91 17018.7,7859.91 17018.7,7901.08 17001.1,7901.08 17001.1,7859.91 " />
<polyline points="17018.7,7880.5 17001.1,7880.5 " />
<polyline points="17018.7,7883.44 17001.1,7883.44 " />
</g>

我想将

替换为:
stroke="rgb(150,150,150)"

to be

stroke="rgb(100,100,100)"

注意,每个实例的原始数值可能不同,但我想将它们全部更改为(100,100,100)。
我尝试了以下操作:
        //Make SVG monochrome
        string svgText = File.ReadAllText(svgPath);
        Regex.Replace(svgText, "stroke=\"rgb(.*,.*,.*)\"", "stroke=\"rgb(100,100,100)\"");
        File.WriteAllText(svgPath, svgText);

当然,它没有起作用,因为有括号。当我在括号前使用转义字符'\('和'\)'时,会出现红色波浪线错误,表示无法识别转义字符,但是对于正则表达式,我应该转义括号字符,以便它们被按照字面意思解释,因为它们是正则表达式的特殊字符。正确吗?
如何在此字符串中使用正则表达式以实现我的目的?

4
为什么你不使用已经存在的XML解析器,而要这样做呢? - rory.ap
4
虽然正则表达式强大,但内置解析器可以帮助您解决所有问题 :) - sniperd
2
您需要对反斜杠进行转义,以防止它们被解释为转义序列的开头。例如:"stroke="rgb\(.,.,.*\)""。或者,您可以使用原始字符串字面量,具体内容请参见此处:https://dev59.com/AnRB5IYBdhLWcg3wro2B - Zak
3
你正在寻找类似于 svgText = Regex.Replace(svgText, @"stroke=""rgb\(\d{1,3},\d{1,3},\d{1,3}\)""", "stroke=\"rgb(100,100,100)\""); 的东西,但实际上最好使用 XML 解析器。 - Evk
3
@EdwardBagby 这是正则表达式中使用的。\d{1,3} 表示“1-3个数字”。 - Evk
显示剩余5条评论
1个回答

2
尽管我不是C#开发人员,但我仍然猜测这适用于你的正则表达式字符串:
@"stroke=""rgb\(\d+,\d+,\d+\)"""

不要使用.*,因为它将匹配零个或多个(几乎)任何字符。

\d将匹配数字(通常只是0-9,但在某些正则表达式方言中,它也可以匹配各种非阿拉伯数字。)

编码愉快!


啊...字面量。又是一个选择。谢谢! - E. A. Bagby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接