Просто схожу с макушки головы ...
string url = "somepage.aspx?cat=22&id=SomeId¶m2=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¶m2=4";
url = regex.Replace(url, "$1");
Assert.AreEqual("somepage.aspx?cat=22¶m2=4",url);
}
[TestMethod]
public void RegexReplacesParameterInFront()
{
string url = "somepage.aspx?id=SomeId&cat=22¶m2=4";
url = regex.Replace(url, "$1");
Assert.AreEqual("somepage.aspx?cat=22¶m2=4", url);
}
[TestMethod]
public void RegexReplacesParameterAtEnd()
{
string url = "somepage.aspx?cat=22¶m2=4&id=SomeId";
url = regex.Replace(url, "$1");
Assert.AreEqual("somepage.aspx?cat=22¶m2=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 - как видно из тестов, это создает трейлинг? или &, если заменяемый параметр является единственным или последним, соответственно. Вы можете использовать строковые методы, чтобы избавиться от этого, хотя, если кто-то знает, как исключить их из результата, используя только регулярные выражения, было бы замечательно увидеть.