首页 > 解决方案 > 什么正则表达式在 2 个模式行之间产生结果?

问题描述

简要地

我正在尝试设置 Sublime Text 4 来隐藏代码中的区域。为此,我使用了 AutoFold 扩展,它可以根据指定的正则表达式折叠代码片段。我需要一个正则表达式,它将提供两行之间的内容,其中第一行包含#region,最后一行包含#endregion.

更接近主题:

有一段代码:

-- #region NAME 1
line 1
line 2
-- #endregion

line 3

-- #region NAME 2
line 4
line 5
-- #endregion

我想得到如图所示的结果

期望的结果

为了演示,我使用了 2 个正则表达式 (?<=-- #region NAME 1)(.|\n)*?(?=-- #endregion)(?<=-- #region NAME 2)(.|\n)*?(?=-- #endregion).

问题

正则表达式应该是什么样子会给出相同的结果?

我是如何尝试的:

  1. (?<=-- #region )(.|\n)*?(?=-- #endregion)给出了类似的结果,但它隐藏了不适合我的区域名称
  2. (?<=\n)[^$]+删除第一行之前的行首\n。看起来与第 1 步一起可以解决我的问题,但我无法将它放在一个表达式中,我尝试过这样的事情:(?<=-- #region )((?<=\n)[^$]+)(?=-- #endregion)
  3. ^.*#region.*\n给出了包含区域和名称的完整行,但也无法使用第 1 项进行组合尝试这样的事情:(?<=(^.*#region.*\n))(.|\n)*?(?=-- #endregion)

标签: regexsublimetext3regex-lookarounds

解决方案


您可以将整行与-- #region匹配到最后。然后你可以使用\K清除匹配缓冲区并匹配直到第一次出现--#endregion

-- #region .+\K[\s\S]*?(?=-- #endregion)

正则表达式演示

考虑换行符:

-- #region .+\R\K[\s\S]*?\R(?=-- #endregion)

正则表达式演示


推荐阅读