VBScript正则表达式:负向Lookbehind:匹配VBScript方法声明不在注释中

时间:2013-03-15 16:34:05

标签: regex vbscript

我正在尝试使用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()”不应该出现;无论方法之前的空格数是多少,如果在方法声明之前至少有一个注释字符(行中的任何位置),我不希望该方法匹配。

1 个答案:

答案 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)的子/函数声明,则必须预处理文件;那么你可以从根本上删除评论(并且仍然使用上面给出的模式)。