.NET Регулярное выражение для значения строки запроса - PullRequest
2 голосов
/ 06 марта 2010

Мне нужно удалить любое "& id = SomeValue" из Url.PathAndQuery. Где 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

Ответы [ 3 ]

7 голосов
/ 06 марта 2010

Просто схожу с макушки головы ...

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 23: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 голосов
/ 06 марта 2010

Сначала я бы проанализировал Querystring для строго типизированных значений, а затем проверял бы с помощью Regex.

C # ASP.NET QueryString парсер

0 голосов
/ 06 марта 2010

Если могут произойти плохие вещи (например, в плане безопасности), если регулярное выражение пропустит параметр "id =", то вам также нужно беспокоиться о том, что строка запроса может содержать шестнадцатеричный эквивалент urlencoded, который является регулярным выражением не узнает. Например, «id» - это «% 69% 64». Также рассмотрите влияние различных заглавных букв «id» на вашу программу. Мое мнение в этой ситуации заключается в том, что вы читаете RFC и создаете полный класс, который может выполнять преобразования в обоих направлениях из набора пар имя-значение в строки запроса. System.Uri не будет этого делать. если вы работаете внутри приложения ASP.NET, вы можете проверить, достаточно ли HttpUtility.ParseQueryString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...