代码之家  ›  专栏  ›  技术社区  ›  Zack

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

  •  0
  • Zack  · 技术社区  · 6 年前

    我正在尝试解析一些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 回复  |  直到 6 年前
        1
  •  1
  •   revo shanwije    6 年前

    你可以在以下时间分开:

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

    分解:

    • \s*\|\s*
    • (?!
      • [^{\[]* 匹配任何东西,除了 { [ 尽可能地
      • []}] 接近尾声 ] }
    • )

    负面展望断言我们不应该达到 } 不匹配开口对。

    看到了吗 live demo here

        2
  •  -2
  •   lacostenycoder    6 年前

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

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

    arr 现在是您请求的数组。