2012-01-09 58 views
2

已知以下 “字符串”?:字符串函数(?正则表达式),以从URL字符串中删除的查询字符串对

  • SomePage.aspx页面ID = 20 &名称=布赖恩&令牌= 1234
  • SomePage的的.aspx?ID = 20 &令牌= 1234 &名=布赖恩
  • SomePage.aspx页面?令牌= 1234 & ID = 20 &名=布赖恩

我想删除在所有情况下令牌的名称/值对,所以我留下?

  • SomePage.aspx页面ID = 20 &名=布赖恩
  • SomePage.aspx页面ID = 20? &名=布赖恩
  • SomePage.aspx页面ID = 20 &名=布赖恩

注:我不能使用Uri类的各种原因。

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

+0

'我不能使用Uri类为各种原因'例如? – 2012-01-09 18:58:50

+0

可能在添加'System.Web'引用的类库中太膨胀了吗?我遇到过。 – kamranicus 2012-01-09 19:02:08

+0

强制包含'System.Web'将导致他的应用程序中断,只有安装了.NET 4.0 Client Profile的用户(这是许多W7机器上默认安装的.Net),因此避免使用'System .Web'来减少部署问题。 – ean5533 2012-01-09 19:10:17

回答

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

参见https://regexr.com/3ia6k

此正则表达式中除去的所有变化的token PARAM,包括变型,其中令牌是唯一PARAM:

  • SomePage.aspx页面标记= 1234

说明:

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

...捕捉token包括其值和终止&
这部分处理下列情况:??

  • SomePage.aspx页面ID = 20 &令牌= 1234 &名=布赖恩
  • SomePage.aspx页面标记= 1234 & ID = 20 &名=布赖恩

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

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

  • SomePage.aspx页面ID = 20 &名=布赖恩&令牌= 1234
  • SomePage.aspx页面标记= 1234
+0

它不会像“abc.com?token = 123”那样传递案例 – yajiv 2017-12-20 11:01:04

+0

@yajiv:您完全正确。虽然你的案例没有被OP要求,但它可能对这个问题的许多访问者非常有用。我已经更新了我的答案,以处理所有可能的组合。还加了一点解释。 – Jpsy 2017-12-20 15:13:12

4

我认为这会为你做(没有机会测试)。

string s = "somePage.aspx?id=20&name=brian&token=1234"; 
s = Regex.Replace(s, @"(&token=[^&\s]+|token=[^&\s]+&?)", ""); 

编辑:更新到正确处理,其中令牌是第一对的情况。

+0

'&?'有什么问题,这使得'&'可选? – 2012-01-09 19:01:15

+0

@JosephSilber在令牌是第一对的情况下,它不会删除尾部的&后面的标记,所以得到的字符串看起来像是'somePage.aspx?&id = 20&name = brian' – ean5533 2012-01-09 19:02:24

+1

正确。这就是为什么你应该使用这个:['token = [^&] +&?'](http://regexr.com?2vlsu) – 2012-01-09 19:04:11

2

考虑使用HttpUtility? ParseQueryString(http://msdn.microsoft.com/en-us/library/ms150046.aspx)解析和UriBuilder构建回来...

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

+1

听起来像他想避免'System.Web',否则他可能会刚刚使用'新的Uri(url)'。 – kamranicus 2012-01-09 19:03:18

+0

@subkamran - Uri在系统中,而不是在System.Web中... – 2012-01-09 19:38:41

相关问题