C# querystring值的.NET正则表达式
我需要从Url.PathAndQuery中去掉任何“&id=SomeValue”。其中SomeValue可以是int或字符串。它后面可能有,也可能没有另一个符号 所以可能是这样C# querystring值的.NET正则表达式,c#,.net,regex,C#,.net,Regex,我需要从Url.PathAndQuery中去掉任何“&id=SomeValue”。其中SomeValue可以是int或字符串。它后面可能有,也可能没有另一个符号 所以可能是这样 somepage.aspx?cat=22&id=SomeId¶m2=4 或 我想和你在一起 somepage.aspx?cat=22¶m2=4 或 刚从我头上跳下来 string url = "somepage.aspx?cat=22&id=SomeId&pa
somepage.aspx?cat=22&id=SomeId¶m2=4
或
我想和你在一起
somepage.aspx?cat=22¶m2=4
或
刚从我头上跳下来
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
一条评论让我感到羞耻,竟然要测试我的代码。你是什么,我的质量保证部门?下面是一个使用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);
}
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¶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 "&"