组内的模式匹配

时间:2017-10-18 18:21:47

标签: regex

我正在努力捕捉内部群体,甚至描述这个问题。例如,用于解析标记的正则表达式类似于:

<section id="foo">
  <title>Code about Bears</title>

  <para>Words</para>

  <para><emphasis>Python Code</emphasis></para>
  <program language="py">import bears</program>

  <para><emphasis>JavaScript Code</emphasis></para>
  <program language="js">var bear = require('bears');</program>

  <section id="bar">
    <title>Code about Bear Cubs</title>

    <para>Words</para>

    <para><emphasis>Python Code</emphasis></para>
    <program language="py">import cubs</program>

    <para><emphasis>JavaScript Code</emphasis></para>
    <program language="js">var cub = require('cubs');</program>
  </section>
</section>

最终我想提取一种特定的语言,所以对于Python:

Code about Bears: id=foo
  import bears

Code about Bear Cubs: id=bar
  import cubs

困难在于保持<section id="bar"/>完整,因为我总是将其内容合并到<section id="foo"/>。想象一下,除了这个简单的例子之外,它还包含更多嵌套的部分/标记。

我做了两次不同的尝试。

First attempt只是提取代码,它可以工作(fwiw这些在PHP的preg_match_all中使用):

/<emphasis>(.*) Code<\/emphasis>\s*<\/para>\s*<program ?(language="(.*)")?>\s*(.*)<\/program>/msUg

但是,这只是提取所有代码并丢失部分上下文,无论是在部分标题还是id。

Second attempt首先提取部分,但效果不好:

/<section id="(.*)">\s*<title>(.*)<\/title>(.*)<\/section>/msUg

它将<section id="foo">与倒数第二个</section>匹配,而不是将内部部分分开。

0 个答案:

没有答案