使用HTML标记的无效Lookbehind

时间:2014-11-20 18:28:19

标签: regex sublimetext sublimetext3 pcre

我们的想法是匹配h3>之后和</section之前的所有代码块,其中匹配实际上是多个<p>...</p>元素

这实际上是在崇高的文本3中(在文件中找到所有内容),目的是将所有这些块包装在<div><\div>标记中(感谢emmet插件,ctrl+shift+g)...

...所以如果你知道它应该有用,告诉我,我会不再担心它。或者如果你能想出另一种方法来实现同样的目标,那也很棒。

我的想法是:

(?<=<\/h3\s*)<p(?:\n|.)*(?!\s*<\/section)

分解它会变得像......

(?<=<\/h3\s*)        # lookbehind for </h3 and any space including newline
<p(?:\n|.)*          # match, if it follows, <p and anything...
(?!\s*<\/section)    # if not followed by spaces and <\section

我得到Invalid lookbehind asserion...,它似乎是第一个星号。

在python 3中这是正确的吗?

已编辑:\ s包含\ n,已更改。另外,如果遇到类似问题,请参阅有关PCRE的评论

1 个答案:

答案 0 :(得分:0)

问题是:

首先,正如MattDMo评论的那样,Sublime使用PCRE正则表达式引擎。

第二,正则表达式中的第三个borken,(?!\s*<\/section)是一个负向前瞻,它应该是一个正面的(如果后面跟着,如果没有后跟,则不是)。那将是(?=\s*</section)

第三,在PCRE中,lookbehinds不能包含*,因为它们必须是固定长度的。这可以通过\K转义来解决,它会重置当前整个匹配的开始,即匹配后跟未包含的匹配,前一个匹配。

最后,在正则表达式的第二个细分部分中,<p(?:\n|.)*最后应包含?,成为<p(?:\n|.)*?。那样的比赛是懒惰的(非贪婪的)。

问题是:

h3>\s*\K<p(?:\n|.)*?(?=\s*</section)