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 の正規表現オブジェクトを使用して、メソッドの文字列全体に対してパターンを実行しています。また、時間を節約するために一度に 1 行ずつ処理する必要はありません。

同様の質問を調べてみました ( 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()" は表示されません。メソッドの前のスペースの数に関係なく、メソッド宣言の前に少なくとも 1 つのコメント文字 (行の任意の場所) がある場合、メソッドを一致させたくありません。

4

1 に答える 1

1

VBScript は行指向です。そのため、次のように複数行 (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)"

コードに複数行にわたる Sub/Function 宣言が含まれている場合 (_ abomination)、ファイルを前処理する必要があります。その後、コメントを根本的に削除できます (それでも上記のパターンを使用できます)。

于 2013-03-15T17:48:45.977 に答える