2016-04-14 43 views
0

我仍然對正則表達式有所瞭解,所以請原諒任何天真。正則表達式與括號內的管道之後的值相匹配

我一直在使用這個網站來測試: http://www.systemtextregularexpressions.com/regex.match

基本上,我在寫一個正則表達式將括號之間的管道後匹配任何值的問題。

給出的例子字符串:

"<div> \n [dont1.dont2|match1|match2] |dont3 [dont4] dont5. \n </div>" 

預計產量將是一個集合:

match1, 
match2 

最近我一直能夠得到迄今:

(?!\[.*(\|)\])(?:\|)([\w-_.,:']*) 

以上給出了數值,包括管道和dont3

我也試過這個傢伙:

\|(.*(?=\])) 

但它輸出:

|match1|match2 

回答

1

下面是做這件事的一種方法:

(?<=\[[^\]]*\|)[^\]|]* 

下面是模式的含義是:

  • (?<=\[[^\]]*\|) - 回顧後的表達,以確保任何比賽必須前面是一個開放的括號,後面跟着任意數量的非近括號字符,後跟一個管道字符
    • (?<= ...) - 聲明一個後向表達式。匹配lookbehind的東西必須在文本之前立即進行匹配。但是,由後向匹配的部分不包含在結果匹配中。
    • \[ - 匹配的開括號字符
    • [^\]]* - 匹配的任何數量的非緊密-括號字符
    • \| - 匹配管道字符
  • [^\]|]* - 匹配任何數目的字符既不是關閉括號或管道字符。

lookbehind是貪婪的,所以它將允許在開放括號和匹配文本之間有任意數量的管道。

+0

這工作!非常感謝! – kkp91

+0

沒問題。有什麼關於它,你不明白?通常我會花時間解釋這種模式的工作原理,但我使用手機,所以這有點具有挑戰性。 –

+0

當你有機會的時候,我會非常感謝你的細數。 – kkp91

0

try this

\[.*?(?:\|(?<mydata>.*?))+\] 

注:在線工具將只顯示你的最後捕獲一個quantifed()給定的匹配,但.NET會記住每個捕獲一組相匹配的多次

0

試試這個:

^<div>\s*[^|]+|([^|]+)|([^|]+)