C# querystring值的.NET正则表达式

C# querystring值的.NET正则表达式,c#,.net,regex,C#,.net,Regex,我需要从Url.PathAndQuery中去掉任何“&id=SomeValue”。其中SomeValue可以是int或字符串。它后面可能有,也可能没有另一个符号 所以可能是这样 somepage.aspx?cat=22&id=SomeId&param2=4 或 我想和你在一起 somepage.aspx?cat=22&param2=4 或 刚从我头上跳下来 string url = "somepage.aspx?cat=22&id=SomeId&pa

我需要从Url.PathAndQuery中去掉任何“&id=SomeValue”。其中SomeValue可以是int或字符串。它后面可能有,也可能没有另一个符号

所以可能是这样

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

我想和你在一起

somepage.aspx?cat=22&param2=4

刚从我头上跳下来

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

一条评论让我感到羞耻,竟然要测试我的代码。你是什么,我的质量保证部门?下面是一个使用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);
    }
regex解释说:

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 "&"
然后用backreference替换该表达式,这样就不会丢失首字母?/&


注意——从测试中可以看出,这会发出尾随?或&当替换的参数分别是唯一参数或最后一个参数时。您可以使用字符串方法来消除这种情况,不过如果有人知道如何仅使用正则表达式将它们排除在结果之外,那就太好了

如果正则表达式丢失了一个“id=”参数,则可能会发生不好的事情(例如,安全方面),那么您还需要担心查询字符串可能包含一个十六进制URL编码的等价物,而正则表达式将无法识别该等价物。例如,“id”是“%69%64”。还要考虑不同的“ID”资本化对你的程序的影响。在这种情况下,我的观点是,您可以阅读RFC并构建一个完整的类,该类可以从一组名称-值对到一个查询字符串进行双向转换
System.Uri
不会执行此操作。如果在ASP.NET应用程序中运行,您可能会调查
HttpUtility.ParseQueryString
是否足够。

我会首先将Querystring解析为强类型值,然后在需要时使用正则表达式进行检查


这段代码不会编译,如果编译错误被修复,它也不会生成正确的输出+1因为伪代码中有很多好主意。嗯,是的……但是我想要模式的C#语法。这包括所需的转义,因为它正在C#中使用。
    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 "&"