我正在尝试为 PHP 创建一个 VSCODE 代码片段,它会自动放置命名空间(基于文件夹路径)。
这个想法是对当前文档的目录进行替换,考虑到我的所有类都位于
MVC
文件夹内,并且它位于 src
文件夹内,示例:
我通过 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;
谁能帮忙解决一下吗?
非常感谢!
你可以使用
"namep": {
"prefix": [
"namep"
],
"body": [
"namespace \\\\${TM_DIRECTORY/(?:.*[\\/\\\\])?src[\\/\\\\]([^\\/\\\\]*)[\\/\\\\]?|[\\/\\\\]([^\\/\\\\]*)/$1\\$2/g}",
],
"scope": "php",
"description": "Try to put namespace automatically"
}
请参阅 正则表达式演示。
很匹配
(?:.*[\/\\])?
- 可选出现除换行符之外的任何 0+ 字符(尽可能多),然后是 \
或 /
src[\/\\]
- src
字符串,然后是 /
/\
([^\/\\]*)
- 第 1 组:除 /
和 \
[\/\\]?
- 可选的 /
/\
字符|
- 或[\/\\]
- \
或 /
字符([^\/\\]*)
- 第 2 组:除 /
和 \
演示:
使用
$1\$2
作为替换字符串会导致奇怪的匹配,Models
字符串永远不会匹配。
另一种方法是不匹配组/替代 1 中的结束分隔符
"namep": {
"prefix": ["namep"],
"body": ["namespace ${TM_DIRECTORY/.*[\\/\\\\]src[\\/\\\\]([^\\/\\\\]+)|[\\/\\\\]([^\\/\\\\]+)/\\${1}${2}/g}",],
"scope": "php",
"description": "Try to put namespace automatically"
}
.*[/\\]src[/\\]
:搜索 src
作为目录名称([^/\\]+)
:第 1 组:src
目录|
:分离替代方案[/\\]
:目录分隔符([^/\\]+)
:第 2 组:目录名称您希望结果中的每个目录名称前面带有 \ 并且组 1 或组 2 为空,因此我们可以使用替换字符串:
\$1$2