繁体   English   中英

使用字典替换C#正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM