【问题标题】:RegEx to capture sub group that uses the same parent tags正则表达式捕获使用相同父标签的子组
【发布时间】:2017-11-16 17:56:52
【问题描述】:

由于组使用相同的父标签,我在捕获多个组时遇到了一些麻烦。

数据块看起来像这样(为了便于阅读,我已经拆分了行,实际数据没有换行符

<w:p w:rsidR="100"><w:r><w:p w:rsidR="250"><w:r><w:t>Phrase 1</w:t></w:r></w:p></w:r><w:r><w:t>Phrase 2</w:t></w:r></w:p>
<w:p w:rsidR="500"><w:r><w:p><w:r><w:t>Phrase 1</w:t></w:r></w:p></w:r><w:r><w:t>Phrase 2</w:t></w:r></w:p>
<w:p w:rsidR="150"><w:r><w:p w:rsidR="51"><w:r><w:t>Phrase 1</w:t></w:r></w:p></w:r><w:r><w:t>Phrase 2</w:t></w:r></w:p>
<w:p><w:r><w:p w:rsidR="2"><w:r><w:t>Phrase 1</w:t></w:r></w:p></w:r><w:r><w:t>Phrase 2</w:t></w:r></w:p>
<w:p w:hi="150"><w:r><w:p w:hi="5"><w:r><w:t>Phrase 1</w:t></w:r></w:p></w:r><w:r><w:t>Phrase 2</w:t></w:r></w:p>

由于子标签以相同的根结束标签结尾(由于惰性先行 - 这是我们想要的,因为数据块不止一个),原始正则表达式死亡:

/(<w:p .*?>|<w:p>)(.*?)<\/w:p>/

所以它永远不会捕获超出的数据:“Text Group 2...”。

括号的使用将不起作用,因为子标签也是动态的,即(&lt;w:p .*?&gt;|&lt;w:p&gt;)

负前瞻组应该在这里解决问题,但我一定有什么混淆?这不会产生有效的结果。

/(<w:p .*?>|<w:p>)(.*?(?!(<w:p .*?>|<w:p>).*?<\/w:p>))<\/w:p>/

使用非捕获组确实将惰性量化器带到最后,但它没有(显然)捕获第一部分:

(<w:p .*?>|<w:p>)((?:((<w:p .*?>|<w:p>).*?<\/w:p>)).*?)<\/w:p>

第二个捕获组所需的输出包含以下所有内容:

<w:r><w:p w:rsidR="250"><w:r><w:t>Phrase 1</w:t></w:r></w:p></w:r><w:r><w:t>Phrase 2</w:t></w:r>

注意这与RegEx match open tags except XHTML self-contained tags 不同,标签在这里被识别并且是一个常数。

【问题讨论】:

标签: regex pcre


【解决方案1】:

我能够通过使用 branch reset group ?| 解决这个问题,它允许我在使用惰性运算符查找尾部的同时结合子模式 + 通配符.

例子:

<w:p[^>]*>((?|(<w:p[^>]*>.*?<\/w:p>)|(.))*?)<\/w:p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多