字符串函数(正则表达式?)从 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 参数,包括标记是唯一参数的变体:

somePage.aspx?token=1234

说明:

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

...捕获token,包括它的值和一个终止的&。 这部分处理以下情况:

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

第 2 部分:[\?&]token=[^&]*$

...捕获token,当它作为最后一个参数和/或唯一参数出现时,连同它的前导?&。 这部分处理以下情况:

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

【讨论】:

它不会像“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 字符串中删除查询字符串对的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式从字符串中删除以www。***开头的URL?

PHP 正则表达式从字符串中删除 http://

Javascript - 正则表达式从标题中删除特殊字符

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?

如何使用正则表达式从字符串中提取第 n 个 URL?

如何使用正则表达式从 html 字符串中获取图像 url