正则表达式以匹配不在括号或大括号内的管道

时间:2018-10-30 18:22:32

标签: ruby regex

我正在尝试解析一些Wiki标记。例如,以下内容:

{{Infobox 
| person
| name = Joe
| title = Ruler
| location = [[United States|USA]] | height = {{convert|12|m|abbr=on}}
| note = <ref>{{cite book|title= Some Book}}</ref>  
}}

可以是开头的文本。我首先删除开始的{{和结束的}},所以我可以认为它们已经消失了。

我想对字符串执行.split(<regex>),以用不在括号或方括号内的所有|字符来分割字符串。正则表达式需要忽略|[[United States|USA]]{{convert|12|m|abbr=on}}中的{{cite book|title= Some Book}}个字符。预期结果是:

[
 'person'
 'name = Joe', 
 'title = Ruler', 
 'location = [[United States|USA]]',
 'height = {{convert|12|m|abbr=on}}',
 'note = <ref>{{cite book|title= Some Book}}</ref>'
]

随时都有换行符,因此我不能只寻找\n|。如果其中有多余的空白,那很好。我可以轻松删除多余的\s*\n*

2 个答案:

答案 0 :(得分:1)

您可以分割:

\s*\|\s*(?![^{\[]*[]}])

故障:

  • \s*\|\s*将管道与任何前导或尾随空格匹配
  • (?!否定超前开始
    • [^{\[]*尽可能匹配{[以外的任何内容
    • []}]直至结束]}
  • )否定超前结束

否定前瞻断言,我们不应该在没有匹配开头对的情况下达到}]

请参见live demo here

答案 1 :(得分:-2)

我从@WiktorStribiżew偷走了正则表达式,但这应该适用于您的输入字符串

regex = (/\w+(?:\s*=\s*(?:\[\[[^\]\[]*]]|{{[^{}]*}}|[^|{\[])*)?/)
arr = str.scan(regex).map{|l| l.strip.delete("\n")}[1..-1]

arr现在是您请求的数组。