【问题标题】:Match Parent Folder in Sublime Text 3 Snippet在 Sublime Text 3 Snippet 中匹配父文件夹
【发布时间】:2018-03-06 20:00:35
【问题描述】:

我正在尝试创建一个输出文件父文件夹名称的 sn-p。例如: /Users/user/src/Page/index.js

返回

Page

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

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

根据 Regex101,将 Page/index.js 与第 1 组中的 Page 匹配。

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

返回

/Users/user/src/

这让我觉得我这样做完全错了。

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

【问题讨论】:

  • 你想通过${1:${TM_FILEPATH 正则表达式的一部分来表达什么?
  • 这是一件崇高的事情。 TM_FILEPATH 是一个变量,它为正则表达式提供完整的文件路径作为输入。
  • 放这个然后重试${1:${TM_FILEPATH/([^\/]+)(?:\/[^\/]+)$/$0/}}
  • 返回整个文件路径。
  • 如果你这样做${1:${TM_FILEPATH/([^\/]+\/[^\/]+)$/$1/}}会怎样?顺便说一句,您期望什么输出?

标签: regex sublimetext3 sublimetext-snippet


【解决方案1】:

我认为您可能会误以为当您使用替换来重写字段(或在本例中为变量)时,整个变量会被正则表达式中的替换文本替换。

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

例如取下面的sn-p:

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

即“匹配任意字符,用等号替换”。如果把这个sn-p展开,结果是:

=home/tmartin/Test/sample.txt

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

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

一个(可能是笨手笨脚的)例子就是这个 sn-p:

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

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

这种情况下的替换是你所期望的:

Test

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2021-06-22
    • 2017-02-11
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多