【问题标题】:.NET Regular expression for querystring value.NET 查询字符串值的正则表达式
【发布时间】:2010-03-06 21:29:57
【问题描述】:

我需要从 Url.PathAndQuery 中删除任何“&id=SomeValue”。 SomeValue 可以是 int 或字符串。并且它可能会或可能不会跟随另一个&符号。

应该是这样的

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

somepage.aspx?cat=tect&id=450

我想留下来

somepage.aspx?cat=22&param2=4

somepage.aspx?cat=tect

【问题讨论】:

  • 嗯,是的...但是我想要该模式的 C# 语法。这包括所需的转义,因为它正在 C# 中使用。

标签: c# .net regex


【解决方案1】:

罢工>

简直想疯了……

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 年 3 月 5 日晚上 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);
    }

正则表达式解释为:

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 - 正如您从测试中看到的那样,这会发出尾随 ?或 & 当被替换的参数分别是唯一一个或最后一个时。您可以使用字符串方法来摆脱它,但如果有人知道如何仅使用正则表达式将它们排除在结果之外,那将是非常好的。

【讨论】:

  • 这段代码不能编译,如果编译错误得到修复,它也不会产生正确的输出。 +1,因为伪代码中有好主意。
【解决方案2】:

如果正则表达式遗漏了“id=”参数,可能会发生不好的事情(例如,安全方面),那么您还需要担心查询字符串可能包含一个十六进制的 urlencoded 等价物,即正则表达式不会认。例如,“id”是“%69%64”。还要考虑“id”的不同大小写对您的程序的影响。在这种情况下,我的观点是您阅读了 RFC 并构建了一个完整的类,该类可以在两个方向上进行从一组名称-值对到查询字符串的转换。 System.Uri 不会这样做。如果您在 ASP.NET 应用程序中运行,您可能会调查HttpUtility.ParseQueryString 是否足够。

【讨论】:

    【解决方案3】:

    我会首先将查询字符串解析为强类型值,然后如果需要,我会使用正则表达式进行检查。

    C# ASP.NET QueryString parser

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多