我正在努力捕捉内部群体,甚至描述这个问题。例如,用于解析标记的正则表达式类似于:
<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>
匹配,而不是将内部部分分开。