regex - 为 C++ header guard 实现 VSCode 片段

标签 regex visual-studio-code vscode-snippets

我尝试在 VSCode 中创建一个片段以快速包含 C++ header 保护。例如,文件路径为 C:\workspace\src\chrome\browser\ui\webui\settings\about_handler.h

代码片段应该像这样生成:

#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_

#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_

来自 VScode snippet syntax guide ,我尝试使用 TM_FILEPATH 变量,但找不到将文件路径转换为上述宏的解决方案。我在下面尝试了一些方法:

  • 使用转换 ${TM_FILEPATH/([^a-zA-Z0-9])|([a-zA-Z0-9])/${1:+_}${2:/upcase}/g}_ 我可以将文件路径生成到 C__WORKSPACE_SRC_CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_。此正则表达式会将所有非数字和非字母字符转换为 _ 并将所有字母字符更改为大写。
  • 通过转换 ${TM_FILEPATH/.*src[\\\\\\/](.*)/${1:/upcase}/> 我可以生成 Chrome\BROWSER\UI\WEBUI\SETTINGS\ABOUT_HANDLER.H。此正则表达式删除了从开始到 src 的路径,因为我当前的工作区位于 src 文件夹中,所以我希望我的 header 宏与它相关。

问题是我无法将这两个转换结合起来以获得我想要的宏。有什么想法可以让它发挥作用吗?

最佳答案

你可以使用

"CppGuard": {
        "prefix": "cppgrd",
        "body": [
          "#ifndef ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}",
          "#define ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}",
          "\n#endif // ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}"
        ]
      }

命令是

${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}"

enter image description here 查看regex demo .

详情

  • (?:^.*\\src\\)?(\w+)(?!\w*$) - 除换行符以外的任意零个或多个字符的可选出现尽可能多,从字符串开头 (^.*) 到 \src\ 子字符串 (\\src\\) ,然后捕获到第 1 组 ((\w+)) 的一个或多个单词字符,后面没有字符串结尾 ((?!\w*$))
  • | - 或者
  • (\W) - 第 2 组:任何非单词字符
  • | - 或者
  • (\w+)$ - 第 3 组:字符串末尾的一个或多个单词字符。

替换的意思是:

  • ${1:/upcase} - 插入第 1 组值变成大写
  • ${2:+_} - 如果第 2 组匹配,插入一个 _
  • ${3:/upcase} - 以大写形式插入第 3 组值
  • ${3:+_} - 如果第 3 组匹配,则插入 _

关于regex - 为 C++ header guard 实现 VSCode 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65156083/

相关文章:

python - 匹配正则表达式,其中要匹配的字符串是从变量构建的

java - 正则表达式从输入字符串中提取表达式

java - 替换java字符串中的正则表达式,其中包含 `
`符号

visual-studio-code - 如何删除由扩展(或内置)引入的 IntelliSense 建议片段

visual-studio-code - 编译器clang.exe在VSCode上找不到 header

c++ - 将选定的行填充到 VSCode 中的光标位置

visual-studio-code - VSCode 个人快捷方式在笔记本编辑器中不起作用

c# - 在命名捕获中获取表达式

python - 如何在 IPython 中为 Selenium 解析 'Process unexpectedly closed with status 11'?

visual-studio-code - 如何提取 TM_FILENAME_BASE 的一部分