我正在尝试解析一些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*
。
答案 0 :(得分:1)
您可以分割:
\s*\|\s*(?![^{\[]*[]}])
故障:
\s*\|\s*
将管道与任何前导或尾随空格匹配(?!
否定超前开始
[^{\[]*
尽可能匹配{
和[
以外的任何内容[]}]
直至结束]
或}
)
否定超前结束否定前瞻断言,我们不应该在没有匹配开头对的情况下达到}
或]
。
答案 1 :(得分:-2)
我从@WiktorStribiżew偷走了正则表达式,但这应该适用于您的输入字符串
regex = (/\w+(?:\s*=\s*(?:\[\[[^\]\[]*]]|{{[^{}]*}}|[^|{\[])*)?/)
arr = str.scan(regex).map{|l| l.strip.delete("\n")}[1..-1]
arr
现在是您请求的数组。