2010-03-06 33 views
2

我需要從Url.PathAndQuery中去除任何「& id = SomeValue」。 SomeValue可以是一個int或一個字符串。它可能會或可能不會跟着另一個&符號。.NET查詢字符串值的正則表達式

所以它可能是

somepage.aspx?cat=22&id=SomeId&param2=4 

somepage.aspx?cat=tect&id=450 

我想會留下

somepage.aspx?cat=22&param2=4 

somepage.aspx?cat=tect 
+0

唔,是啊...不過我想該模式的C#語法。這包括需要轉義,因爲它正在C#中使用。 – Paul 2010-03-06 15:43:19

回答

7

只是去了我的頭頂部...

string url = "somepage.aspx?cat=22&id=SomeId&param2=4"; 
Regex regex = new Regex("([\?\&])id=[^\?\&]+"); 
url = regex.replace(url, "\1"); 
System.Diagnostics.Debug.WriteLine("url = " + url); 

更新2010-03-05下午11時12 PST

我一直被評論羞愧爲真正測試我的代碼。你是什​​麼,我的質量保證部門?這裏有一個使用MSTest的工作示例。

Regex regex = new Regex(@"([\?\&])id=[^\&]+[\&]?"); 

    [TestMethod] 
    public void RegexReplacesParameterInMiddle() 
    { 
     string url = "somepage.aspx?cat=22&id=SomeId&param2=4"; 
     url = regex.Replace(url, "$1"); 
     Assert.AreEqual("somepage.aspx?cat=22&param2=4",url); 
    } 

    [TestMethod] 
    public void RegexReplacesParameterInFront() 
    { 
     string url = "somepage.aspx?id=SomeId&cat=22&param2=4"; 
     url = regex.Replace(url, "$1"); 
     Assert.AreEqual("somepage.aspx?cat=22&param2=4", url); 
    } 

    [TestMethod] 
    public void RegexReplacesParameterAtEnd() 
    { 
     string url = "somepage.aspx?cat=22&param2=4&id=SomeId"; 
     url = regex.Replace(url, "$1"); 
     Assert.AreEqual("somepage.aspx?cat=22&param2=4&", url); 
    } 

    [TestMethod] 
    public void RegexReplacesSoleParameter() 
    { 
     string url = "somepage.aspx?id=SomeId"; 
     url = regex.Replace(url, "$1"); 
     Assert.AreEqual("somepage.aspx?", url); 
    } 

    public void RegexIgnoresMissingParameter() 
    { 
     string url = "somepage.aspx?foo=bar&blet=monkey"; 
     url = regex.Replace(url, "$1"); 
     Assert.AreEqual("somepage.aspx?foo=bar&blet=monkey", url); 
    } 

正則表達式,解釋說:

Look for a "?" or an "&" character (and store it as a backreference) 
followed by "id=" 
followed by one or more non-"&" characters. 
optionally followed by another "&" 

然後替換表達反向引用,這樣你就不會失去你的初始/ &?

note - 正如您從測試中可以看到的那樣,這會產生一個拖尾?或&當被替換的參數分別是唯一的一個或最後一個。你可以使用字符串方法來擺脫這種情況,但如果有人知道如何僅使用正則表達式將它們排除在結果之外,那麼它將非常棒。

+0

如果編譯錯誤得到解決,此代碼不會編譯,也不會生成正確的輸出。 +1,因爲僞代碼中有好的想法。 – 2010-03-06 00:57:56

+0

好的,現在運行。 – roufamatic 2010-03-06 07:21:41

0

如果不好的事情可能發生(例如,安全明智的),如果一個「id =」參數是由正則表達式錯過了,那麼你還需要擔心的是,查詢字符串可能包含一個十六進制url編碼等同,其中常規表達不會認出。例如,「id」是「%69%64」。還要考慮「id」的不同大小寫對你的程序的影響。我在這個問題上的看法是,您閱讀了RFC並構建了一個完整的類,可以從一組名稱 - 值對轉換爲查詢字符串。 System.Uri不會這樣做。如果您正在ASP.NET應用程序內部運行,則可以調查HttpUtility.ParseQueryString是否足夠。

相關問題