2013-08-30 27 views
1

我有一個字符串,如下所示匹配的限制,當匹配滿足另一

id=16&xxx&sid=3 
xxx&sid=3&id=5 
xxx&xxx&id=6 
sid=5&xxxx 

基本上,有idsid,我想用正則表達式來分析他們的價值觀,但問題是都與「ID」

結束時,我有以下的正則表達式

ssid=(\d{1,}) 
id=(\d{1,}) 

我能做些什麼,以第二個表達式id=(\d{1,})它認爲ss(id)= x匹配。 考慮到我不知道表達前會發生什麼,我該如何解決這個問題?

我怎麼可以這樣做,只要它不是由ss

+0

你可以使用兩種模式? – progrenhard

+0

@progenhard是的,我可以 – user1590636

+0

另外16&xxx是你認爲在你的第一個例子中的id值,或者它只是16.是否有一個特定的值約束? – progrenhard

回答

2

/(?:^|[^s])id=(\d+)/之前將匹配,除非前面加一個s

第一部分FO正則表達式認爲這是一個比賽:(?:^|[^s])意味着「匹配啓動字符串或什麼,但一個S」

的您還會注意到我切換到\d{1,}因爲\d+他們做同樣的事情

更新:

,因爲它不是 「SID」 你要設法避免,但 「SSID」,而不是使用:

/(?:^|[^s])s?id=(\d+)/

這將匹配SID,但不SSID,如果是你需要什麼

+0

哈哈哈你的比我好1 – progrenhard

1

由於這看起來像一個URL的查詢參數列表,我認爲它是一個。

我不認爲單一的正則表達式就是最好的解決方案。最乾淨和明顯的解決方法是:

  • 分割字符串上&
  • 拆分各部分上=,創建地圖
  • 查找鍵,你在地圖

這樣需要,稍後可以稍微使用來自該字符串的更多參數。它還有助於稍後閱讀代碼並在視覺上驗證其正確性。

這一般擴展到URL處理。更好地將其解析爲可讀結構(不論您的語言如何),併爲各個部分使用訪問功能。由於URL部分的正確轉義和迴避並非微不足道,因此應該有一個小庫。