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
有没有一个正则表达式或字符串函数可以做到这一点?我想这可以帮你做到(还没有机会测试) 编辑:更新以正确处理令牌为第一对的情况
(\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=[^&]*$)