[英]C# Regex replace using Dictionary
我正在寻找一种一次性替换字符串的多个字符的选项。 我正在尝试将字符串作为参数传递给URL,该URL具有特殊字符,例如“ /,+,(,),# ”。 所以我需要做一些编码。 在一个问题中,我遇到了这个选项Regex Replace
下面是代码
var input = "Product name A/C 2+2 (Mod #1)";
var space = "%20";
var slash = "%2F";
var plus = "%2B";
var open = "%28";
var hashV = "%23";
var close = "%29";
var replacements = new Dictionary<string,string>()
{
{" ",space},
{"/",slash},
{"+",plus},
{"(",open},
{"#",hashV},
{")",close}
};
var regex = new Regex(String.Join("|",replacements.Keys));
var replaced = regex.Replace(input,m => replacements[m.Value]);
Console.WriteLine(replaced);
我收到以下错误
System.ArgumentException: parsing " |/|+|(|#|)" - Quantifier {x,y} following nothing.
但是如果我comment out
加号,请打开并关闭,对于这些替换,我得到的输出没有任何问题。
Product%20name%20A%2FC%202+2%20(Mod%20%231)
为什么替换对这些字符不起作用? 我在这里做错什么了吗?如果还有其他方法可以解决这个问题,我也愿意尝试一下。 但我想更好地理解这一点。
这与使用字典没有关系-仅仅是因为您在正则表达式( +
, (
和)
)中使用具有特殊含义的字符而没有引用它们。 如果仅具有value = Regex.Replace(input, "(", "%28")
您可以使用Regex.Escape
来解决此问题:
var regex = new Regex(String.Join("|",replacements.Keys.Select(Regex.Escape)));
您确定没有内置的转义方法可以实现您想要的功能,例如URL编码器吗? 例如HttpUtility.UrlEncode
? (我不是URL编码方面的专家,这里可能有一些细微之处-我建议您使用现有的编码器,而不要自己滚动。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.