在Sublime Text 3 Snippet中匹配父文件夹

时间:2018-03-06 20:00:36

标签: regex sublimetext3 sublimetext-snippet

我尝试创建一个输出文件的父文件夹名称的代码段。例如: /Users/user/src/Page/index.js

返回

Page

我有这种正则表达式模式:

([^\/]+)(?:\/[^\/]+)$

根据Regex101,在第1组中Page/index.jsPage匹配。

试试这个: ${1:${TM_FILEPATH/([^\/]+)(?:\/[^\/]+)$/$2/}}

返回

/Users/user/src/

这让我觉得我完全错了。

我不确定如何使用Sublime / Perl的字符串格式选项来实际返回正确的字符串。我甚至可能没有正确的模式。做这个的最好方式是什么?

1 个答案:

答案 0 :(得分:1)

我认为你可能会成为这样一种假设,即当你使用替换来重写字段(或者在这种情况下是变量)时,整个变量会被正则表达式中的替换文本替换。

实际上,正则表达式是匹配的,变量中的匹配文本将替换为您在正则表达式中提供的替换,然后插入整个(新修改的)变量值。

例如,请使用以下代码段:

<snippet>
    <content><![CDATA[
${TM_FILEPATH/./=/}
]]></content>
    <tabTrigger>lpc</tabTrigger>
    <description>Last path component of the current file</description>
</snippet>

这是&#34;匹配任何角色,用等号替换它#34;。如果展开此代码段,则结果为:

=home/tmartin/Test/sample.txt

第一个斜线匹配并被替换,然后变量扩展为奇怪的路径。

因此,为了仅捕获最后一个路径组件,您使用的正则表达式必须完全使用整个变量值,以便替换将整个值替换为您想要的部分。

这个(可能是火腿)的例子是这个片段:

<snippet>
    <content><![CDATA[
${TM_FILEPATH/^.*\/([^\/]+)\/[^\/]+$/$1/}
]]></content>
    <tabTrigger>lpc</tabTrigger>
    <description>Last path component of the current file</description>
</snippet>

现在从字符串的开头,它贪婪地匹配所有内容,然后是斜杠,然后是捕获最后一个路径段的捕获组,后面是最后一个斜杠,其余部分直到字符串的结尾

在这种情况下,替换更符合您的期望:

Test
相关问题