この質問はこれに大きく関連していますが、グローバル変数への参照を含むメソッドを取得することに関係しています (コメントアウトされていません)。
次の正規表現とテスト文字列を使用して機能するかどうかを確認していますが、部分的にしか機能していません。
正規表現
^((?:(?:Public|Private)\s+)?(?:Function|Sub).+)[\s\S]+?(GLOBAL_VARIABLE_1)[\s\S]+?End\s+(?:Function|Sub)$
(サブマッチとしてメソッドの名前を取得できるように、このようにキャプチャ グループで正規表現の一部が必要です)。
テスト文字列
'-----------------------------------------------------------------------------------------
'
' the code: Header
'
'-----------------------------------------------------------------------------------------
Dim GLOBAL_VARIABLE_1
Dim GLOBAL_VARIABLE_2
Dim GLOBAL_VARIABLE_3
Public Function doThis(byVal xml)
'' Created : dd/mm/yyyy
'' Return : string
'' Param : xml- an xml blob
return = replace(xml, "><", ">" & vbLf & "<")
GLOBAL_VARIABLE_1 = 2 + 2
doThis = return
End Function
msgbox GLOBAL_VARIABLE_1
Public Function doThat(byVal xPath)
'' Created : dd/mm/yyyy
'' Return : array
' 'Param : xPath
return = split(mid(xPath, 2), "/")
GLOBAL_VARIABLE_2 = 2 + 2
doThat = return
End Function
GLOBAL_VARIABLE_2 = 2 + 2
Public Sub butDontDoThis()
'' Created : dd/mm/yyyy
'' Return : string
' 'Param : obj
For i = 0 To 5
return = return & "bye" & " "
Next
End Sub
GLOBAL_VARIABLE_3 = 3 + 3
Public Sub alsoDoThis(byRef obj)
'' Created : dd/mm/yyyy
'' Return : string
' 'Param : obj, an xml document object
For i = 0 To 4
return = return & "hi" & " "
Next
GLOBAL_VARIABLE_1 = 1 + 1
End Sub
GLOBAL_VARIABLE_3 = 3 + 3
http://www.regexpal.com/を使用すると、グローバル変数を参照する最初のメソッドを強調表示できます。ただし、正規表現は、他の方法で期待することを行っていません。正規表現は、特定のグローバル変数への参照を持たない他のメソッドもピックアップしており、実際にグローバル変数を使用している最後のメソッドで終了します。問題は、[\s\S]+?(GLOBAL_VARIABLE_1)[\s\S]+?End\s+(?:Function|Sub)$
パーツが最小限の/貪欲でない一致を行っているため、実際の一致が見つかるまで探し続けることであると判断しました。
要約すると、式は次の規則に従う必要があります。
- メソッドの宣言の最初の端を検出したときに、現在チェックしているメソッドのスキャンを停止します。この例では、
doThis
とalsoDoThis
メソッドのみが に一致するはずGLOBAL_VARIABLE_1
ですが、正規表現がどうあるべきかわかりません。 - 正規表現は、実際にグローバル変数を使用しているメソッドのみに一致する必要があります
- a
GLOBAL_VARIABLE_1
がコメント化されている場合、実際にはメソッドによって使用されていません。コメントGLOBAL_VARIABLE_1
は、メソッドの肯定的な一致をトリガーするべきではありません。