根据文件路径中的最后一个文件夹重命名 C# 上的命名空间

Renaming namespaces on C# according to the last folder in the file path

我正在尝试创建一个片段,使用文件路径中最后一个目录的名称在 C# 中命名命名空间,但它 returns 它之前的所有内容。

这是一个 demo of the regex,VSCode 片段,替换值如下所示:

${1:${TM_DIRECTORY/(?<=[\/\\])([a-zA-Z\-_]+$)/${2:/pascalcase}/}}

因为 VS Code 的怪癖和特殊选项。
输出始终是第一组,但最后我调用了第二组。 这是什么原因造成的?

你至少有几个问题。

首先,路径的第一部分正在“返回”,因为您实际上并不匹配它。正如您在演示 link.

中看到的那样,lookbehind 不包括该文本作为匹配的一部分

因此,不匹配的文本根本不会在代码段中进行转换,它只会出现在原来的位置。

所以你想匹配那部分路径,即使你最终不会使用它。

也许你想要这个正则表达式:(.*[\/\\])([-\w]+$)注意没有后视

regex demo

然后:

${1:${TM_DIRECTORY/(.*[\/\\])([-\w]+$)/${2:/pascalcase}/}}"

请注意,捕获组 2 pascal-cased 并且未使用捕获组 1(包括最终路径分隔符之前的所有内容),因此它已被有效删除 - 即,它不是在替换中。

Note the backslashes are doubled because the pattern is passed as a string literal, and / chars must be escaped because the string literal contains a "stringified" regex literal.

  • 来自

\\ 转义每个反斜杠一次,它是 \ 和另一个 \ 在它是 [=51= 之后导致 \ ]。反斜杠在 [] 中仍然用作转义字符,因此如果您想要文字 \,则必须对其进行转义。为了像 \ 这样连续出现两个反斜杠,每个反斜杠本身都必须在 vscode 片段字符串中进行转义。