字符串函数(正则表达式?)从 url 字符串中删除查询字符串对
Posted
技术标签:
【中文标题】字符串函数(正则表达式?)从 url 字符串中删除查询字符串对【英文标题】:String function (regex?) to remove query string pair from url string 【发布时间】:2012-02-06 06:54:23 【问题描述】:给定以下示例“字符串”:
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 类。
是否有一个单一的正则表达式或字符串函数可以做到这一点?
【问题讨论】:
I cannot use the Uri class for various reason
例如?
可能在类库中添加System.Web
引用实在是太臃肿了?我遇到过。
强制包含 System.Web
会导致他的应用程序对于只安装了 .Net 4.0 客户端配置文件(这是许多 W7 机器上的 .Net 的默认安装)的任何人中断,所以它使避免使用System.Web
以减少部署问题。
@ean5533 - Uri 不在 System.Web 中,它在 System - msdn.microsoft.com/en-us/library/system.uri.aspx
我不能使用 Uri 类的原因是因为我正在处理绝对路径和各种相对路径(“../”、/SomeFolder/ 等)的组合并且能够可能无法得出真正的路径。
【参考方案1】:
我认为这会为你做到(还没有机会测试)。
string s = "somePage.aspx?id=20&name=brian&token=1234";
s = Regex.Replace(s, @"(&token=[^&\s]+|token=[^&\s]+&?)", "");
编辑:已更新以正确处理令牌是第一对的情况。
【讨论】:
@JosephSilber 在令牌是第一对的情况下,它不会删除令牌之后的尾随&
,因此生成的字符串看起来像 somePage.aspx?&id=20&name=brian
正确。这就是为什么你应该使用这个:token=[^&]+&?
附言。使用正则表达式 static
以避免性能问题,特别是考虑到这可能会在请求中被多次调用。
@JosephSilber 好主意,更简洁。发布它作为答案,它比我的更好。
@JosephSilber 我为那个代码辛苦了好几个小时,但对于你我会允许的。【参考方案2】:
(\btoken=[^&]*&|[\?&]token=[^&]*$)
见https://regexr.com/3ia6k
此正则表达式删除所有变体中的token
参数,包括标记是唯一参数的变体:
说明:
第 1 部分:\btoken=[^&]*&
...捕获token
,包括它的值和一个终止的&
。
这部分处理以下情况:
第 2 部分:[\?&]token=[^&]*$
...捕获token
,当它作为最后一个参数和/或唯一参数出现时,连同它的前导?
或&
。
这部分处理以下情况:
【讨论】:
它不会像“abc.com?token=123”这样的大小写 @yajiv:你完全正确。尽管 OP 没有要求您的案例,但它可能与此问题的许多访问者非常相关。我已经更新了我的答案以处理所有可能的组合。还加了一点解释。【参考方案3】:考虑使用 HttpUtility.ParseQueryString (http://msdn.microsoft.com/en-us/library/ms150046.aspx) 进行解析并使用 UriBuilder 构造回...
注意查询字符串中参数的所有编码和排序 - Uri 类会有所帮助。
【讨论】:
听起来他想避免System.Web
,否则他可能会使用new Uri(url)
。以上是关于字符串函数(正则表达式?)从 url 字符串中删除查询字符串对的主要内容,如果未能解决你的问题,请参考以下文章