2012-01-09 57 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

相關問題