正则表达式搜索避免嵌套结果

时间:2015-11-19 13:49:08

标签: regex atom-editor

我的文档包含几个代码块实例,如下所示:

{% highlight %}
//some code
{% endhighlight %}

在Atom.io中,我正在尝试编写正则表达式搜索来捕获它们。

我的第一次尝试是:
{% highlight .* %}([\S\s]+){% endhighlight %}

问题是因为同一个文档中有几个代码块,它也会捕获第一个代码块,直到最后一个代码块,所有这些都在一个匹配中。

我要排除{字符:
{% highlight .* %}([^\{]+){% endhighlight %}

但问题是某些代码块包含有效的{个字符(例如function(){ ... })。

3 个答案:

答案 0 :(得分:1)

使用非贪婪匹配:

{% highlight .* %}([\S\s]+?){% endhighlight %}
                          ^

答案 1 :(得分:1)

Karthik的懒惰匹配解决方案的问题是,当{% highlight %}{% end highlight %}之间有大的子串时,[\s\S]*?会将越来越多的文本存储到回溯缓冲区中,最终会超出

使用unrolling-the-loop技术,您可以避免这种情况:

{% highlight %}([^{]*(?:{(?!% endhighlight %})[^{]*)*){% endhighlight %}

请参阅regex demo

这样,高亮区块内的子串可以是任意长度,性能将保持快速。

主要的正则表达部分:

  • {% highlight %} - 与{% highlight %}文字字面匹配
  • ([^{]*(?:{(?!% endhighlight %})[^{]*)*) - 匹配并捕获第1组中未匹配{% endhighlight %}的所有内容:
    • [^{]* - 除{
    • 以外的0个或多个字符
    • (?:{(?!% endhighlight %})[^{]*)* - 0或更多序列....
      • {(?!% endhighlight %}) - 文字{后面没有% endhighlight %}
      • [^{]* - 除{
      • 以外的0个或多个字符
  • {% endhighlight %} - 与{% endhighlight %}文字字面匹配

这与{% highlight %}([\s\S]*?){% endhighlight %}基本相同,但是“unwraped”。线性执行可确保更安全,更快速的用户体验。

答案 2 :(得分:-2)

此正则表达式只能获取{% highlight %} ... {% endhighlight %}中的内容:

(?<={% highlight %}).*(?={% endhighlight %})

测试: https://regex101.com/r/nX6wV8/1

对不起我的失败,我希望这可以帮到你

新表达: https://regex101.com/r/qX2cA1/1