C# 字符串函数(regex?),用于从url字符串中删除查询字符串对

C# 字符串函数(regex?),用于从url字符串中删除查询字符串对,c#,asp.net,regex,c#-4.0,.net-4.0,C#,Asp.net,Regex,C# 4.0,.net 4.0,给出以下示例“字符串”: somePage.aspx?id=20&name=brian&token=1234 somePage.aspx?id=20&token=1234&name=brian somePage.aspx?token=1234&id=20&name=brian 我希望在所有情况下都删除令牌的名称/值对,因此我只剩下: somePage.aspx?id=20&name=brian somePage.aspx?id=20&name=brian somePage.aspx?id=

给出以下示例“字符串”:

  • somePage.aspx?id=20&name=brian&token=1234
  • somePage.aspx?id=20&token=1234&name=brian
  • somePage.aspx?token=1234&id=20&name=brian
我希望在所有情况下都删除令牌的名称/值对,因此我只剩下:

  • somePage.aspx?id=20&name=brian
  • somePage.aspx?id=20&name=brian
  • somePage.aspx?id=20&name=brian
注意:由于各种原因,我不能使用Uri类


有没有一个正则表达式或字符串函数可以做到这一点?

我想这可以帮你做到(还没有机会测试)

编辑:更新以正确处理令牌为第一对的情况

(\btoken=[^&]*&|[\?&]token=[^&]*$)

此regexp删除所有变体中的
标记
参数,包括其中标记是唯一参数的变体:

  • somePage.aspx?令牌=1234
说明:

第1部分:
\btoken=[^&]*&

…捕获
标记
,包括其值和终止的
&

本部分处理以下情况:

  • somePage.aspx?id=20&token=1234&name=brian
  • somePage.aspx?token=1234&id=20&name=brian
第2部分:
[\?&]token=[^&]*$

…当标记显示为最后一个参数和/或唯一参数时,捕获该标记及其前导的

本部分处理以下情况:

  • somePage.aspx?id=20&name=brian&token=1234
  • somePage.aspx?令牌=1234

考虑使用HttpUtility.ParseQueryString()进行解析,并使用UriBuilder构造回


注意查询字符串中参数的所有编码和排序-Uri类会有帮助。

由于各种原因,我不能使用Uri类,例如
?可能在添加
系统的类库中。Web
引用太多了?我遇到过这种情况。强制包含
System.Web
会导致任何只安装了.Net 4.0客户端配置文件(这是许多W7机器上默认安装的.Net)的人的应用程序中断,因此避免
System.Web
以减少部署问题是有意义的。@ean5533-Uri不在System.Web中,它在系统中-我不能使用Uri类的原因是因为我处理的是绝对路径和各种相对路径的组合(“../”、/SomeFolder/,等等),并且可能无法导出真实路径。@JosephSilber在令牌是第一对的情况下,它不会删除令牌后的尾随
&
,因此,结果字符串看起来像
somePage.aspx?&id=20&name=brian
Correct。这就是为什么您应该使用:PS。使regex
成为静态的
,以避免性能问题,特别是考虑到这可能会在一个请求中被多次调用。@JosephSilber好主意,简洁得多。把它贴出来作为答案,它比我的要好。@JosephSilber我花了几个小时的时间研究代码,但对你来说我会允许的。听起来他想避免使用
System.Web
,否则他可能只会使用
新的Uri(url)
。它不会通过像“abc.com?token=123”这样的大小写。@yajiv:你完全正确。虽然OP没有要求您的案例,但它可能与此问题的许多访问者非常相关。我已经更新了我的答案,以处理所有可能的组合。还添加了一些解释。
(\btoken=[^&]*&|[\?&]token=[^&]*$)