我们的想法是匹配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的评论
答案 0 :(得分:0)
问题是:
首先,正如MattDMo评论的那样,Sublime使用PCRE正则表达式引擎。
第二,正则表达式中的第三个borken,(?!\s*<\/section)
是一个负向前瞻,它应该是一个正面的(如果后面跟着,如果没有后跟,则不是)。那将是(?=\s*</section)
。
第三,在PCRE中,lookbehinds不能包含*
,因为它们必须是固定长度的。这可以通过\K
转义来解决,它会重置当前整个匹配的开始,即匹配后跟未包含的匹配,前一个匹配。
最后,在正则表达式的第二个细分部分中,<p(?:\n|.)*
最后应包含?
,成为<p(?:\n|.)*?
。那样的比赛是懒惰的(非贪婪的)。
问题是:
h3>\s*\K<p(?:\n|.)*?(?=\s*</section)