匹配嵌套标记的平衡出现

时间:2016-04-28 05:01:45

标签: ruby regex

我有一个测试字符串:

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]](它错过了]]的最后一次出现。

如何匹配每个[[ .. ]]块的剩余部分?这是正确的吗?

2 个答案:

答案 0 :(得分: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]]"
]

答案 1 :(得分: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]]"]