回答:
此正则表达式有效:
<item>(?:(?!</item>).|\n)*?(?:(?=201[0-3]</pubDate>))(?:(?!</item>).|\n)*?</item>
而这个使堆栈崩溃:
<item>(?:(?!</item>).|\n)*(?:(?=201[0-3]</pubDate>))(?:(?!</item>).|\n)*</item>
这也有效,没有前瞻:
(?s)<item>.*?201[0-3]</pubDate>.*?</item>
原始问题:
我在 Sublime Text 2 中有一个 XML 文件(下面的示例)。我想找到从 2010 年到 2013 年<item
包含 > 元素的所有 > 元素。<pubDate
上面的正则表达式工作正常,但是当我找到所有(文件大约 1MB,大约有 120 个匹配项)时,ST2 的堆栈空间不足。
上面潜伏着什么可怕的低效率?
示例 XML:
<?xml version="1.0" encoding="utf-8"?>
<channel>
<item>
<title>This will match</title>
<link>http://gcanyon.posterous.com/</link>
<pubDate>Sat Mar 10 10:22:00 -0800 2012</pubDate>
<dc:creator><![CDATA[Geoff Canyon]]></dc:creator>
</item>
<item>
<title>This won't</title>
<link>http://gcanyon.posterous.com/</link>
<pubDate>Tue Jun 30 05:01:32 -0700 2009</pubDate>
<dc:creator><![CDATA[Geoff Canyon]]></dc:creator>
</item>
</channel>
</rss>