我有一个给定的多行源代码和一个{行索引}。我想知道,如果源代码行(让我们说第12行'$var3 = "bar")被Func/EndFunc包围,以及它在哪个函数中。在本例中,它位于"_MyFunction2"
$var1 = "Test"
Func _MyFunction()
$var2 = 1234
EndFunc
$var3 = "foo"
_MyFunction()
_MyFunction2()
Func _MyFunction2()
$var3 = "bar"
EndFunc
MsgBox(0,"",$var1)
我构建的模式看起来像这样- replace "12"加上相应的行号:
^(?m)(?:Func ([^(]+).+n|.*n){12}(?s)(?=(?:.(?<!Func))+EndFunc)
我的问题是有没有更优雅或更高效的方法?我觉得这个正则表达式很笨拙。
不幸的是,由于#cs
和#ce
以及其他东西,这样的正则表达式可能太复杂了
我建议使用tidy.exe
解析器工具。可以在SciTE的目录("full")需要安装)
用法:"tidy.exe" "yourScript.au3" /gen_doc
输出解析后的源代码,包括函数、行号和变量列表。您应该逐行解析输出:
- 在变量列表中查找以
'#### '
开头的行 - 为每个变量解析其名称和'Dim'行号,使用regexp
- 现在在源代码列表部分 中找到带有这个数字的行
- 如果行不是以
NNNNN |
开头,那么变量是全局作用域 - 否则,在函数列表中搜索行号大于变量行号的函数,这将是你的函数