2010-08-10 109 views
0

我希望使用C#中的正則表達式替換來轉換查詢字符串。用正則表達式重寫URL

我有一些定義的查詢字符串參數(即A,B和C)。

我想改變這樣的

page.aspx?A=XXX&B=YYY&C=1 

到的東西:

page/XXX/YYYY/true 

需要注意的是A和B的前兩個參數值,只是會連接起來,但部分我有麻煩與在輸出中將C=1更改爲true

這可以完成嗎?如果沒有找到C=1部分,我不想輸出任何東西:

page.aspx?A=XXX&B=YYY 

變爲:

page/XXX/YYY 

我不認爲在源查詢字符串A的順序和B曾經以不同的順序,但如果B出現在A之前,可以寫一些東西來應對?

我一直在嘗試各種。至關重要的是,我很想知道這是否可以實現,因爲如果不能,我必須以另一種方式來做。

+2

使用普通的c#代碼而不是正則表達式會更簡單(也更清晰)。 – 2010-08-10 15:03:39

回答

0

正如Robert H在評論中提到的那樣,您可能比使用正則表達式更好地使用String.Replace()。如果你想成爲真正明確的,我會做,雖然與正則表達式(如果你真的需要它)就是其中分爲三個不同的語句,使你打電話
Regex.Replace(yourString, [patern for A=], "page/");
Regex.Replace(yourString, [patern for B=], "/");
Regex.Replace(yourString, [patern for C=], "true");

你在做什麼,首先爲每個模式調用Regex.Match()以驗證輸入中存在的模式。那麼,如果它丟失了,你可以跳過這個替換。

因此,這應該爲你工作:注意:檢查完成沒有錯誤,用「原樣」風險自擔

string input = "A=xxx&B=yyy&C=1"; 
string input2 = "A=xxx&B=yyy"; 

if(Regex.Match(input, "A=").Success) input = Regex.Replace(input, "A=", "page/"); 
if(Regex.Match(input,@"\&B=").Success) input = Regex.Replace(input, @"\&B=", "/"); 
if(Regex.Match(input,@"\&C=1").Success) input = Regex.Replace(input, @"\&C=1", "/true"); 

if(Regex.Match(input2, "A=").Success) input2 = Regex.Replace(input2, "A=", "page/"); 
if(Regex.Match(input2,@"\&B=").Success) input2 = Regex.Replace(input2, @"\&B=", "/"); 
if(Regex.Match(input2,@"\&C=1").Success) input2 = Regex.Replace(input2, @"\&C=1", "/true"); 

Console.WriteLine(input); //Output = page/xxx/yyy/true 
Console.WriteLine(input2); //Output = page/xxx/yyy 
+0

這很有趣。正如我在回覆JMarsch時所說的,我希望將這些東西放在配置文件中,這似乎是一種可行的做事方式。 別擔心 - 我會自己承擔風險; – Shane 2010-08-10 16:30:28

1

你可能是最好不要使用正則表達式。
試試這個:

 

      string urlString = "page.aspx?A=XXX&B=YYY&C=1"; 
      var builder = new System.UriBuilder(urlString); 
      // the first character in Query will be a "?" 
      string[] queries = builder.Query.Substring(1).Split('&'); 
 

在這一點上,你必須每個查詢項目分離成其自己的字符串。您可以在數組的每個元素上使用內置的字符串方法(如queryies [0] .StartsWith())來標識哪個字符串是「C」查詢字符串,並根據需要構建您的路徑。

+0

非常感謝您的及時回覆JMarsch!我原以爲這是我要走下去的路線。我只是想知道是否可以創建一個單一的正則表達式來完成這項工作,因爲我可以將它放入一個配置文件中,並在C#組件中替換爲'generic'。 感謝您的幫助。 – Shane 2010-08-10 16:29:01