2015-11-26 81 views
0

我試圖讓一對物業價值中的OData的網址是$過濾器裏面,所以我有這個URL獲取使用多個屬性和值的正則表達式

/odata/TopSellingItem?$ expand = Item,Item($ select = Name),Branch,Branch($ select = Name,$ filter = A ne 'B')& $ filter = Year + eq + 2015 + and + Month + eq +'January'& $ select =年,月,值

,我想要得到的結果

  • 一個NE 'B'
  • 年+ EQ + 2015
  • 月+ EQ + '一月'

我試圖

(?<=\$filter=)(.*?)(?=\&|\)) 

但我只捕獲了

  • 一個NE 'B'
  • 年+ EQ + 2015 +和+月+ EQ + '一月'

是有什麼樣重新評估捕獲組的結果發現另一組模式或任何的其他最好的辦法才達到我的目標

在此先感謝

我準備了一個在線測試儀

https://regex101.com/r/jO6nU5/1

+0

您的STRING「NE」而不是「新」 ... –

+0

爲什麼不拿2分的結果,你得到,然後在第二個步驟對其進行處理(如將它們分割上'+和+'或任何您的具體要求)。或者有什麼理由要用單一的正則表達式來完成它? – vesan

+0

是的,我可以做到這一點,但我的要求,它需要1行正則表達式的唯一 –

回答

1

這看起來像功課或腦筋急轉彎的採訪,但我會咬(Regex101):

\$filter=(.+?)(?:&|\)|(\+and\+))(?(2)([^&)]+)) 

你然後提取組1和3說明:

\$filter=(.+?)  -- match any character after `$filter` and put them into capture group 1 
(?:&|\)|(\+and\+)) -- stop when you encounter `&`, `)` or `+and+` 
        -- if you stop at `+and+`, put that into capture group 2 
(?(2)([^&)]+))  -- if capture group 2 participated in the match, 
        -- continue capturing until `&` or `)` 

(?(condition)then|else)是有條件:

  • 條件可以是前瞻(?(?=pattern)then|else),一看落後,或其負面變體。
  • 它也可以是一個檢查組,n參加了比賽(?(n)then|else),這是我們使用的。這裏不需要else部分。

聲明:這具有僅1 +and+匹配的限制。例如,給定此字符串:

$filter=abc+and+213+and+1234 

Group 1 = abc 
Group 2 = +and+ 
Group 3 = 213+and+1234 

我歡迎所有努力來改進它。

+0

哎,它的工作..非常感謝主席先生。其實,我創造的OData,我不需要把枚舉命名空間中篩選查詢價值的延伸,如果有是一個枚舉屬性..;) –