我正在尝试使用VBScript构造一个正则表达式来提取未注释掉的VBScript方法声明。例如,请考虑以下方法:
Public Function thisContainsACommentedRoutine()
'' Public Sub myRoutine1()
'' print "hello"
'' End Sub
thisContainsACommentedRoutine = 1 + 1
End Function
'Public Sub myRoutine2()
' print "routine2"
'End Sub
Private Sub sub1()
print "sub1"
End Sub
我希望提取以下方法声明:
Public Function thisContainsACommentedRoutine()
Private Sub sub1()
我尝试使用以下正则表达式(以及其他许多表达式;我尝试使用负面监视器进行研究,但在VBScript中不支持它们,因此我也尝试使用负面预测):
(?!')(Public|Private) (Function|Sub) .*
使用http://regexpal.com,但是正在提取所有方法声明,我想在方法声明之前忽略包含注释字符的所有行。
上面第一个代码块中的代码作为整个字符串返回给我,我使用VBScript的正则表达式对象在整个方法字符串上执行模式。另外,我想避免一次处理一行以节省时间。
我尝试查找类似的问题(Regular Expression Negative Lookbehind Alternative for VBScript),但不知怎的,我正在使用的负面前瞻正则表达式仍在抓取已注释掉的方法。
有什么建议吗?
编辑:我正在使用.NET的正则表达式对象,它支持负面的lookbehind断言。我现在使用以下正则表达式:
\s*?(?<!')\s*?(Public|Private) (Function|Sub) .*
然而,我仍然得到不正确的比赛:
Public Function thisContainsACommentedRoutine()
Public Sub myRoutine1()
Private Sub sub1()
匹配“Public Sub myRoutine1()”不应该出现;无论方法之前的空格数是多少,如果在方法声明之前至少有一个注释字符(行中的任何位置),我不希望该方法匹配。
答案 0 :(得分:1)
VBScript是面向行的。因此,您可以尝试使用Multiline(VBScript)RegExp来利用该功能,如下所示:
Dim sAll : sAll = goFS.OpenTextFile("..\testdata\subfnc.txt").ReadAll()
WScript.Echo sAll
WScript.Echo "--------------"
Dim reSF : Set reSF = New RegExp
reSF.Global = True
reSF.IgnoreCase = True
reSF.Multiline = True
reSF.Pattern = "^\s*((?:(?:Public|Private)\s+)?(?:default\s+)?(?:Sub|Function).+)\r$"
Dim oMT
For Each oMT in reSF.Execute(sAll)
WScript.Echo qq(oMT.SubMatches(0))
Next
输出:
Public Function thisContainsACommentedRoutine()
'' Public Sub myRoutine1()
'' print "hello"
'' End Sub
thisContainsACommentedRoutine = 1 + 1
End Function
'Public Sub myRoutine2()
' print "routine2"
'End Sub
Private Sub sub1()
print "sub1"
print "Private Sub Sub2(abc)"
End Sub
Sub Nix
End Sub ' Nix
Public Default Function Zilch(Whatever)
End Function
--------------
"Public Function thisContainsACommentedRoutine()"
"Private Sub sub1()"
"Sub Nix"
"Public Default Function Zilch(Whatever)"
如果您的代码包含跨越行(_ abomination)的子/函数声明,则必须预处理文件;那么你可以从根本上删除评论(并且仍然使用上面给出的模式)。