regex - 用于捕获函数的 tmLanguage 正则表达式,它可以包含许多函数
问题描述
我的 vscode 扩展 tmLanguage 不是为 JavaScript 明确构建的,但我将使用它作为示例,因为它演示了最佳用例。举个例子:
1 function {
2 var p = 9;
3
4 function do() {
5 console.log(p);
6 }
7
8 var expr = function() {
9 console.log(p);
10 }
11
12 var cons = new Function('\tconsole.log(p);');
13
14 var arrow = () => { console.log(p); }
15 }
16
17 function
18 {
19 console.log('hello world');
20
21 return 'hello world';
22 }
我的目标是捕获第 1 行作为开始,第 15 行作为结束标记,第 2-14 行作为函数体标记。并分别对#17-22 行重复。请注意,我的函数起始行不是特定于空格的,并且可能会根据用户的判断在新行上。
我尝试了许多不同的方法,使用\G
锚或其他方法,下面的语法示例是我最接近的。但是,它在第一个找到的右大括号之后停止}
,或者在我上面的示例中的第 6 行之后。我希望它在第 15 行结束捕获
functions:
patterns:
- begin: (?:^|\s)(function)\s+
beginCaptures:
'1' : { name: meta.tag.function-name }
end : (?<=(\}))
endCaptures:
'1' : { name: entity.punctuation.definition.end }
patterns:
- begin: \{
beginCaptures:
'1' : { name: entity.punctuation.definition.start }
end : \}
patterns:
- begin: \s*
end : "[^\\}]*"
name: meta.tag.function-body
我的示例是使用 yaml,但是任何您喜欢使用的与 vscode 一起使用的东西都可以
编辑根据 Gama11 的反馈,我能够让它工作。本质上,该过程中最重要的部分是递归。所以基本上我没有改变任何东西,只是添加了一个递归正则表达式来查找{}
对。这是工作示例:
patterns:
- begin: (?:^|\s)(function)\s+
beginCaptures:
'1' : { name: meta.tag.function-name }
end : (?<=\})
patterns:
- begin : \{
beginCaptures:
'0' : { name: entity.punctuation.definition.start }
end : \}
endCaptures:
'0' : { name: entity.punctuation.definition.end }
contentName: meta.tag.function-body
patterns :
- include : '#parens'
repository:
parens:
- patterns:
- begin : \{
end : \}
patterns:
- include : '#parens'
解决方案
推荐阅读
- python - 嵌套 Python For 循环中继续的范围是什么?
- azure - 如何将 Bitnami Sonarqube VM 更改为企业版
- java - 运行时权限应该采用相同的方法。如何正确处理?
- python - 自定义 Keras 损失函数,计算涉及占位符和常量张量对象
- c++ - CMake add_executable() 使用 .cpp 文件还是 .hpp 文件?
- c - 将“char (*)[128]”传递给“char **”类型参数的不兼容指针类型
- elasticsearch - 查询多个术语的有效方法
- data-science - Google 的 AutoML Table 是否会在训练/评估之前对我的数据样本进行洗牌?
- scala - 如何将 Oracle Wallet 与 Sqoop 开发人员 API 结合使用
- git - Dockerfile git clone 文件权限