2013-03-15 3 views
1

VBScript를 사용하여 정규식을 구성하여 주석 처리되지 않은 VBScript 메서드 선언을 추출하려고합니다. 예를 들어, 다음과 같은 방법을 고려하십시오VBScript 정규식 : 부정적인 Lookbehind : 일치하는 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)을 찾으려고했지만 어쨌든 부정적인 lookahead 정규 표현식은 여전히 ​​주석 처리 된 메소드를 포착합니다.

제안 사항?

EDIT : .NET의 정규 표현식 개체를 대신 사용하고 있는데 부정적인 표정 어설 션을 지원합니다. 지금은 다음과 같은 정규 표현식을 사용하고 있습니다 : 그러나

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

을, 나는 아직도 잘못 일치를 받고 있어요 :

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

경기를 "공공 서브 myRoutine1()"게재되어서는 안된다; 메서드 앞의 공백 수에 관계없이 메소드 선언 앞에 적어도 하나의 주석 문자 (줄의 아무 곳이나)가 있으면 메서드가 일치하지 않게해야합니다.

답변

1

VBScript는 줄 방향입니다. 그래서 당신은에서와 같이 여러 줄 (VBScript를) 정규식을 사용하여 해당 기능을 악용 할 수 있습니다

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)" 

코드가 하위/기능 라인에 걸쳐 선언 (_ 가증)가 포함되어있는 경우, 파일을 사전 처리해야합니다. 당신은 근본적으로 코멘트를 제거 할 수 있습니다 (그리고 여전히 위에 주어진 패턴을 사용합니다).

+0

는 사실 내 대답을 얻기 위해 다음과 같은 정규 표현식을 사용할 수 있었다 : '(공공 | 개인) (<('+) \는 *이야?!?) (기능 | 서브) *' . 하지만 VBScript에 대한 정규 표현식 개체의 MultiLine 속성에 대해 알지 못했습니다. 감사! – user2174745