1

我正在尝试使用 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 的正则表达式对象,它支持否定的后向断言。我现在使用以下正则表达式:

\s*?(?<!')\s*?(Public|Private) (Function|Sub) .*

但是,我仍然得到不正确的匹配:

Public Function thisContainsACommentedRoutine()
Public Sub myRoutine1()
Private Sub sub1()

匹配“Public Sub myRoutine1()”不应该出现;不管方法前有多少个空格,如果方法声明前至少有一个注释字符(行中的任何位置),我不希望方法匹配。

4

1 回答 1

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),则必须预处理文件;然后你可以彻底删除评论(并且仍然使用上面给出的模式)。

于 2013-03-15T17:48:45.977 回答