2016-04-28 67 views
0

我有一個測試字符串:匹配均衡的嵌套標記

s = "A test [[you|n|note|content of the note with a [[link|n|link|http://link]] inside]] paragraph. wef [[you|n|note|content of the note with a [[link|n|link|http://link]] inside]] test"

我需要匹配[[...]]部分字符串的出現。可以有高達嵌套[[ ]]標籤的字符串中的第二電平(如在測試字符串示出)。

我開始與/\[\[.*?\]\]/,但只有符合以下幾點:? [[you|n|note|content of the note with a [[link|n|link|http://link]](它缺少]]最後一次出現

我該如何去對每一個[[ .. ]]塊的剩餘部分匹配這可能與正則表達式?

+0

你只想外的呢?你內部有單個'['或']'嗎? – sawa

+1

你的例子所期望的結果是什麼? –

回答

1

如果你沒有單個孤立的[],那麼它是非常簡單的。下面假設在嵌套層次沒有限制。

s.scan(/(?<match>\[\[(?:[^\[\]]|\g<match>)*\]\])/).flatten 

回報:

[ 
    "[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]", 
    "[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]" 
] 
+0

謝謝@sawa!這很好。現在,我需要使用這個正則表達式並將它與另一個結合起來。我有一個要求,我需要在文本中匹配更改。 默認情況下與我匹配'/ \ s /'所以我對待每一個變化作爲一個整體詞。我需要修改它,以便匹配「所有單詞的變化,將'[[..]]'塊視爲整個單詞」。 string.split(正則表達式)''的一個例子的輸出是:'[ 「A」, 「測試」,「[[你| N |註釋|帶有[[鏈接註釋的內容| N |鏈路| HTTP://link]]裏面]]「,」段落。「]'。 這可能嗎? – Sean

1

這裏有一個非正則表達式的解決方案。我假設左(右)括號總是成對出現。

level = 0 
s.each_char.each_cons(2).with_index.with_object([]) do |(pair, i), a| 
    case pair.join 
    when "[[" 
    level += 1 
    a << i if level==1 
    when "]]" 
    a << i+1 if level==1 
    level -= 1 
    end 
end.each_slice(2).map { |b,e| s[b..e] } 
    #=> ["[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]", 
    # "[[you|n|note|content of the note with a [[link|n|link|http://link]] inside]]"]