大きなデバイス構成ファイルがあり、RegEx を使用して、さらにコーディングするために関連部分を解析しようとしています... 解析しようとしている構成の部分は、「edit ServiceName ;mode」という単語で始まり、独自の行に「exit」という単語で終わります。この設定ファイルと返される文字列は複数行になります。特定のキーワードを含むこの構成ファイルの特定の部分のみを返すか一致させたい...
Sub TestRegEx_1()
Dim TestString
Dim objRegEx, f_objResults, f_Match
TestString = "edit NonMatch1 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit NonMatch2 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit GoodMatch1 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"KeyWord_1 1 2 and 3" & vbCrLf & _
"exit" & vbCrLf & _
"edit GoodMatch2 ;mode" & vbCrLf & _
"KeyWord_2 A B and C" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit NonMatch3 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit GoodMatch3 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"KeyWord_3 1A" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit"
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
objRegEx.Global = True
objRegEx.Pattern = "^edit (.{0,}) \;mode[\s\S]*?" & _
"(?=(KeyWord_1|KeyWord_2|KeyWord_3))[\s\S]*?exit$"
Set f_objResults = objRegEx.Execute(TestString)
For Each f_Match In f_objResults
MsgBox f_Match.Value
Next
End Sub
RegEx は貪欲なので、上記のルーチンは不要な部分を含む一致を返します。ルーチンを 2 つの別々の RegEx パターン検索に分割して正しく機能させることができましたが、これを行う必要がないように最初のパターン検索を変更したいと考えています。以下のルーチンは、探している出力を作成します。
Sub TestRegEx_2()
Dim TestString
Dim objRegEx, f_objResults, f_Match
TestString = "edit NonMatch1 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit NonMatch2 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit GoodMatch1 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"KeyWord_1 1 2 and 3" & vbCrLf & _
"exit" & vbCrLf & _
"edit GoodMatch2 ;mode" & vbCrLf & _
"KeyWord_2 A B and C" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit NonMatch3 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit" & vbCrLf & _
"edit GoodMatch3 ;mode" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"KeyWord_3 1A" & vbCrLf & _
"Something Random" & vbCrLf & "Something Random" & vbCrLf & _
"exit"
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
objRegEx.Global = True
'This Works...
objRegEx.Pattern = "^edit (.{0,}) \;mode[\s\S]*?exit$"
Set f_objResults = objRegEx.Execute(TestString)
objRegEx.Pattern = "(?=(KeyWord_1|KeyWord_2|KeyWord_3))"
For Each f_Match In f_objResults
If objRegEx.test(f_Match.Value) Then
MsgBox f_Match.Value
End If
Next
End Sub
個別の RegEx パターンを作成せずにこれを機能させるには、最初のパターン マッチで何を変更する必要がありますか? 「exit」の最初のインスタンスの後に停止するように RegEx エンジンに明示的に指示するにはどうすればよいですか? どんな助けでも大歓迎です!ありがとうございました。
編集:マッチによって返されたいテスト文字列の部分を追加しました。「GoodMatch」セクションには、1 つ以上のキーワードを含めることができます。セクション全体を返す必要があります。
edit GoodMatch1 ;mode
Something Random
Something Random
KeyWord_1 1 2 and 3
exit
edit GoodMatch2 ;mode
KeyWord_2 A B and C
Something Random
Something Random
exit
edit GoodMatch3 ;mode
Something Random
Something Random
KeyWord_3 1A
Something Random
Something Random
exit