簡體   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