我需要从 Url.PathAndQuery 中删除任何“&id=SomeValue”。其中 SomeValue 可以是 int 或字符串。它后面可能会也可能不会跟另一个和号。
可以这样
somepage.aspx?cat=22&id=SomeId¶m2=4
或
somepage.aspx?cat=tect&id=450
我想留下来
somepage.aspx?cat=22¶m2=4
或
somepage.aspx?cat=tect
最佳答案
<罢工>罢工>
<罢工>刚刚离开我的头顶......
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 11:12 PM 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 "&"
然后用反向引用替换该表达式,这样就不会丢失初始的 ?/&。
注意——正如您从测试中看到的那样,这会发出尾随 ?或 & 当被替换的参数分别是唯一的一个或最后一个时。您可以使用字符串方法来摆脱它,但如果有人知道如何仅使用正则表达式将它们排除在结果之外,那将是非常好的。
关于c# - 查询字符串值的 .NET 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390808/