0

一行で情報を取得するようにしました。次のような情報のリストがあります。

1 1 838028476391 4 23 36 P 1/820-01 *

2 1 838028476490 4 23 36 P 1/820-17 *

3 1 838028474271 4 23 36 P 1/820-21 *

4 1 838028476292 4 23 36 P 1/820-21 *

5 1 838028474263 4 23 36 P 1/820-23 *

6 1 838028473802 4 23 36 P 1/820-21 *

そして、すべての行から 12 桁の数字が必要です。私はこのコードを試しました:

 Dim re As String
  Dim re18 As String
  re18 = "(\d{12})"
  Dim r3 As New RegExp
  r3.Pattern = re18
  r3.IgnoreCase = True
  r3.MultiLine = True


 If r3.Test(Body) Then
    Dim m3 As MatchCollection
    Set m3 = r3.Execute(Body)
    If m3.Item(0).SubMatches.Count > 0 Then
        Dim number
        For j = 1 To m3.Count
            Set number = m3.Item(j - 1)
            MsgBox ("Number: " + number)
        Next
    End If
  End If

マクロをデバッグして時計で m3 を表示しても、最初の一致しか得られません。一致するのは 1 つだけです。また、\d{12} の後に量指定子 * または + を使用しようとしました

この正規表現を機能させるにはどうすればよいですか?

正規表現に関しては、別の質問があります。特別な単語の後に何かを一致させたい場合は、その単語をパターンの先頭に置き、その後ろに数字などを入れます。この正規表現を実行すると、パターンの先頭に置いた単語を含む情報または一致を取得できますか?! のように: "BUS \d{12}" 結果として数字だけが必要ですが、数字の前に BUS があることを知っています...

4

1 に答える 1

1

Globalではなく、オプションを使用する必要がありますMultilineMultilineアンカー (^および$) の動作を変更して、テキスト全体の先頭と末尾だけでなく、各行の先頭と末尾に一致するようにします。 最初のものだけでなく、すべての一致Globalを見つけるように指示するオプションです。

おそらく、SubMatches プロパティも使用する必要はありません。正規表現には、一致全体をキャプチャするキャプチャ グループが 1 つしかありません。つまりm3.SubMatches、 には 1 つのアイテムのみが含まれItem(0)、 とまったく同じになりますm3.Item(0)。(最初のグループのインデックスが であることに注意して0ください1。他の正規表現ツールを使用する場合とは異なります。)

2 番目の質問は、SubMatches プロパティの出番です。「BUS」という単語に続く 12 桁の数字をすべて見つけたい場合は、次のような正規表現を使用します。

BUS\s*(\d{12})

...そして、次のように各一致から番号を取得します。

Set m3 = r3.Execute(Body)
For Each myMatch in m3
  MsgBox("Number: " + m3.SubMatches(0).Value)
Next

詳細については、このページを参照してください。

于 2012-09-12T17:05:01.107 に答える