由于这些组使用相同的父标签,我在捕获多个组时遇到了一些麻烦。
数据块看起来像这样(我为了便于阅读而拆分了行,实际数据没有换行符)
<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>
原始正则表达式因为子标记以相同的根结束标记结束而死亡(由于懒惰的前瞻 - 这是我们想要的,因为数据的blob不止一个):
/(<w:p .*?>|<w:p>)(.*?)<\/w:p>/
所以它永远不会捕获超出的数据:“Text Group 2 ...”。
支架使用不起作用,因为子标签也是动态的,即(<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: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不同,标签在此处标识并且是常量。
答案 0 :(得分:0)
我能够通过使用分支重置组 ?| 来解决这个问题,它允许我在使用延迟运算符查找尾部的同时组合子模式+通配符
示例:
<w:p[^>]*>((?|(<w:p[^>]*>.*?<\/w:p>)|(.))*?)<\/w:p>