Regex for SublimeText Snippet



我已经在这个崇高片段上停留了一段时间了。

我想在使用 TM_FILEPATHTM_FILENAME 创建新类时显示正确的包名称。

打印TM_FILEPATH变量时,我得到如下内容:

/Users/caubry/d/[...]/src/com/[...]/folder/MyClass.as

我想转换此输出,以便我可以得到类似以下内容:

com.[...].folder

这包括:

  • /com/[...]/folder/MyClass.as之前删除任何内容;
  • 删除TM_FILENAME及其扩展名;在本例中MyClass.as ;
  • 最后找到所有的斜杠并用点替换它们。

到目前为止,这就是我得到的:

${1:${TM_FILEPATH/.+(?:src/)(.+).w+/l$1/}}

这将显示:

com/[...]/folder/MyClass

我确实了解如何用点代替飞溅,例如:

${1:${TM_FILEPATH///./g/}}

但是,我很难将此逻辑添加到前一个逻辑中,以及删除逻辑末尾的TM_FILENAME。

我对正则表达式真的没有经验,提前谢谢。

:]

编辑:[...]表示文件夹数量可变。

我们可以通过一些技巧在一次替换中做到这一点。我们要做的是,我们将几个不同的案例放入我们的模式中,并对每个案例进行不同的替换。实现此目的的诀窍是替换字符串不得包含文字字符,但完全由"反向引用"组成。在这种情况下,那些没有参加比赛的小组(因为他们是不同情况的一部分)将简单地写回一个空字符串,而不是为替换做出贡献。让我们开始吧。

首先,我们希望删除最后一src/之前的所有内容(以模仿您的代码段的行为 - 如果您想删除第一个src/之前的所有内容,请使用不贪婪的量词):

^.+/src/

我们只想删除它,所以没有必要捕获任何东西 - 也不需要写回任何东西。

现在我们要匹配后续文件夹,直到最后一个文件夹。我们将捕获文件夹名称,也匹配尾随/,但写回文件夹名称和.。但是我说替换字符串中没有文字!因此,.也必须来自捕获。这里有一个假设,即您的文件始终具有扩展名。我们可以通过展望从文件名中获取句点。我们还将使用该前瞻来确保前面至少还有一个文件夹:

^.+/src/|G([^/]+)/(?=[^/]+/.*([.]))

我们将用$1$2替换它.现在,如果第一个备选捕获,则组$1$2将为空,并且前导位仍将被删除。如果第二个备选方案捕获,则$1将是文件夹名称,$2将捕获一个时间段。甜。G是一个锚点,可确保所有匹配项彼此相邻。

最后,我们将匹配最后一个文件夹及其后面的所有内容,并且只写回文件夹名称:

^.+/src/|G([^/]+)/(?=[^/]+/.*([.]))|G([^/]+)/[^/]+$

现在,我们将用最终解决方案的$1$2$3替换它。演示。

概念上类似的变体是:

^.+/src/|G([^/]+)/(?:(?=[^/]+/.*([.]))|[^/]+$)

替换为 $1$2 。我真的只考虑了第二种和第三种选择的开头。演示。

最后,如果Sublime使用Boost的扩展格式字符串语法,实际上可以有条件地将字符放入替换中(而不会神奇地从文件扩展名中变出它们):

^.+/src/|G(/)?([^/]+)|G/[^/]+$

现在,我们有第一个替代项,用于最多 src 个(要删除)的所有内容,第三个替代项用于最后一个斜杠和文件名(将被删除),以及要保留的所有文件夹的中间替代项。这次我把斜杠可以选择地放在开头。使用条件替换,我们可以在那里编写一个.当且仅当该斜杠匹配时:

(?1.:)$2

不幸的是,我现在无法对此进行测试,而且我不知道使用 Boost 正则表达式引擎的在线测试器。但这应该可以很好地解决问题。

最新更新