我有一个测试字符串:
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 :(得分: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]]"]