TextMate 转换以替换匹配的重复组中的单个字符

TextMate transform to replace single character in matched repetitive group

长话短说;博士 给我一个通用的 vscode 片段,将“/home/me/projects/project/src/Commands/Interfaces/Whatever”转换为“Commands\Interfaces\Whatever”

大家好, 我正在使用 Vscode 并试图弄清楚文件目录的简单转换以插入 PHP 命名空间。 到目前为止,我还想不出一个简单的通用解决方案来解决这个看似平凡的问题:

乍一看这似乎很微不足道,对吧?从

开始
${TM_DIRECTORY/\//\\/}

然后从那里开始。问题是,我只想捕获部分文件名,然后在捕获的组上转换斜线,而不求助于 fixed/maximum 数量的文件名组件(在这种情况下,有一个丑陋、冗长的解决方案)

以下方向是否正确?如果是这样,替换字符串会导致什么 组 $1 但斜杠已还原?

${TM_DIRECTORY/.*\/src(\/([^\/]+))+$/??????/}

提前致谢,可接受的回答是“除非您放宽要求,否则没有办法”,这更多是关于正则表达式功能的理论问题。

编辑:

感谢@WiktorStribiżew 找到了最简单的解决方案,在我发布问题后,我想出了一个比他复杂得多的表达式:

${TM_DIRECTORY/(([^\/]+)\/?(?=.*\/src\/))|(\/src\/)|((?<=\/src\/.*)\/?([^\/]+))/${5:+\\}/g}

您可以使用

"${TM_DIRECTORY/^.*?[\\\/]src[\\\/]|([\\\/])/${1:+\\}/g}"

请参阅 regex demo(在结果字符串的开头有一个额外的 \,因为无法像在 VS Code 中那样引入条件替换模式)。

详情:

  • ^ - 字符串开头
  • .*? - 除换行字符外的任何零个或多个字符,尽可能少
  • [\\/] - /\ char
  • src - 需要删除子目录的目录名称
  • [\\/] - 一个 /\ 字符
  • | - 或
  • ([\\/]) - 第 1 组:一个 /\ 字符。

${1:+\} 替换意味着我们仅在第 1 组比赛发生时用 \ 替换。

注意反斜杠需要加倍,末尾的 g 会替换所有出现的地方。