我的文档包含几个代码块实例,如下所示:
{% highlight %}
//some code
{% endhighlight %}
在Atom.io中,我正在尝试编写正则表达式搜索来捕获它们。
我的第一次尝试是:
{% highlight .* %}([\S\s]+){% endhighlight %}
问题是因为同一个文档中有几个代码块,它也会捕获第一个代码块,直到最后一个代码块,所有这些都在一个匹配中。
我要排除{
字符:
{% highlight .* %}([^\{]+){% endhighlight %}
但问题是某些代码块包含有效的{
个字符(例如function(){ ... }
)。
答案 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 %}
的所有内容:
[^{]*
- 除{
(?:{(?!% endhighlight %})[^{]*)*
- 0或更多序列....
{(?!% endhighlight %})
- 文字{
后面没有% endhighlight %}
[^{]*
- 除{
{% endhighlight %}
- 与{% endhighlight %}
文字字面匹配这与{% highlight %}([\s\S]*?){% endhighlight %}
基本相同,但是“unwraped”。线性执行可确保更安全,更快速的用户体验。
答案 2 :(得分:-2)
此正则表达式只能获取{% highlight %} ... {% endhighlight %}
中的内容:
(?<={% highlight %}).*(?={% endhighlight %})
测试: https://regex101.com/r/nX6wV8/1
对不起我的失败,我希望这可以帮到你