1

これはRegEx の続きです 単語が 2 つの単語の間に存在する場合にのみ一致を返す

vbScript または VBA で RegEx を使用して、文字列内の特定の単語をすべて見つけようとしています。この文字列は大きな構成ファイルから取得され、他のデータが含まれていますが、必要な文字列のブロックを別の RegEx コマンドで解析できます。以下のテスト ルーチンでは、各 OR された単語の最初の出現を見つけて停止します。文字列内に存在する場合、見つかった各単語のすべての出現とインスタンスを返そうとしています。ループさせる方法やチェックを続ける方法がわかりません...

以下の正規表現テスター リンクも作成しました: http://regex101.com/r/zP8aT3

Sub TestRegEx_1()
Dim TestString, X
Dim objRegEx, f_objResults, f_Match

TestString = "edit GoodMatch1 ;mode" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "KeyWord_2 A B and C and also D E" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "KeyWord_3 1 A and 2 B" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "KeyWord_1 1 2 and 3 and also 4 5" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "exit"

Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
objRegEx.Global = True

objRegEx.Pattern = "^edit\s(.*?)\s\;mode[\S\s]*?(?=.*?\b(KeyWord_1|KeyWord_2|KeyWord_3|NonExistant_1)\b)(?=.*?\b(1|2|3|A|B|C|8|9|10|X|Y\Z)\b)[\S\s]*?exit$"
Set f_objResults = objRegEx.Execute(TestString)
For Each f_Match In f_objResults
    'MsgBox f_Match
    For Each X In f_Match.submatches
        MsgBox X
    Next
Next

End Sub

私が達成しようとしているのは、以下のようなものです。

'Expected f_Match.SubMatches Output in a loop
'GoodMatch1
'KeyWord_2
'A
'B
'C
'KeyWord_3
'1
'A
'2
'B
'KeyWord_1
'1
'2
'3

または、同様の実行可能なもの...追加情報が必要な場合はお知らせください。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

さて、今回はブロック全体をキャプチャしなくても構わない場合は、前の質問のために書いた最初の 2 つの正規表現を変更して使用できます。

(?:(?:edit (\S+))|(KeyWord_1|KeyWord_2|KeyWord_3)|\b([0-9A-Z])\b)(?=(?:(?!edit[^;]+;mode )[\s\S])*?exit)

正規表現101のデモ

(?:(?:edit (\S+))|(KeyWord_1|KeyWord_2|KeyWord_3)|\b([0-9A-Z])\b)

大きなグループで、3 つの可能な一致に分けられます。

(?:edit (\S+))編集名を取得します。

(KeyWord_1|KeyWord_2|KeyWord_3)キーワードを取得するには

\b([0-9A-Z])\b文字/数字を取得する

そして、前の「ブロック全体」の正規表現を使用して最初にブロックを抽出し、これを使用して個々のキーワードを取得できると思います。残念ながら、その「ブロック正規表現」は個々のキャプチャを実行できません。これは、一致の重複が許可されておらず、既にブロック全体に一致しているため、取得する部分ごとに 1 つのキャプチャ グループが必要になるため、あまり実用的ではありません。 ..私がまだ知らない方法がない限り。=P

于 2013-10-10T19:11:27.583 に答える