我正在尝试为 VSCODE CODE SNIPPET 创建一个 PHP,它会自动放置命名空间(基于文件夹路径)。
想法是在当前文档的目录上进行替换,考虑到我所有的类都位于MVC
文件夹内,而它位于src
文件夹内,示例:< /p>
我使用 VSCODE 代码段变量 $TM_DIRECTORY
获得了完整的文件夹名称。
显然在 REGEX 上没有错误,如您所见:https://regex101.com/r/P8CpkX/1
我对代码片段的尝试:
"namep": {
"prefix": [
"namep"
],
"body": [
"",
"// TM_DIRECTORY: $TM_DIRECTORY",
"namespace ${TM_DIRECTORY/.*src\/(([^\/]*)(\/)?)|(\/)([^\/]*)/$2\\$5/g};"
],
"scope": "php",
"description": "Try to put namespace automatically"
}
结果:
// TM_DIRECTORY: /home/user/dev/project/src/MVC/Models/Access/Auth
namespace ${TM_DIRECTORY/.*src/(([^/]*)(/)?)|(/)([^/]*)/$5/g};
但预期是(如 REGEX 所示):
// TM_DIRECTORY: /home/user/dev/project/src/MVC/Models/Access/Auth
namespace \MVC\Models\Access\Auth;
有人能帮忙解决吗?
非常感谢!!!
答案 0 :(得分:2)
你可以使用
"namep": {
"prefix": [
"namep"
],
"body": [
"namespace \\\\${TM_DIRECTORY/(?:.*[\\/\\\\])?src[\\/\\\\]([^\\/\\\\]*)[\\/\\\\]?|[\\/\\\\]([^\\/\\\\]*)/$1\\$2/g}",
],
"scope": "php",
"description": "Try to put namespace automatically"
}
参见regex demo。
匹配
(?:.*[\/\\])?
- 除换行符以外的任意 0+ 个字符的可选出现,然后是 \
或 /
src[\/\\]
- 一个 src
字符串,然后是 /
/\
([^\/\\]*)
- 第 1 组:除 /
和 \
之外的任何零个或多个字符[\/\\]?
- 可选的 /
/\
字符|
- 或[\/\\]
- \
或 /
字符([^\/\\]*)
- 第 2 组:除 /
和 \
之外的任何零个或多个字符演示:
答案 1 :(得分:1)
使用 $1\$2
作为替换字符串会导致奇怪的匹配,Models
字符串永远不会匹配。
另一种方法是不匹配 group/alternative 1 中的结束分隔符
"namep": {
"prefix": ["namep"],
"body": ["namespace ${TM_DIRECTORY/.*[\\/\\\\]src[\\/\\\\]([^\\/\\\\]+)|[\\/\\\\]([^\\/\\\\]+)/\\${1}${2}/g}",],
"scope": "php",
"description": "Try to put namespace automatically"
}
.*[/\\]src[/\\]
: 搜索 src
作为目录名([^/\\]+)
: Group 1: src
目录后的目录名|
: 分离备选方案[/\\]
: 目录分隔符([^/\\]+)
: 第 2 组:目录名称您希望结果中的每个目录名称都带有 \ 并且组 1 或组 2 为空,因此我们可以使用替换字符串:\$1$2