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

我只得到第一场比赛——即使我调试 makro 并在手表中查看 m3——也只有一场比赛。我还尝试在 \d{12} 之后使用量词 * 或 +

如何让这个 RegEx 工作?

关于RegEx,我还有另一个问题:如果我想在一个特殊单词之后匹配某些东西,我会将这个单词放在模式的开头和后面的数字或任何我想要的东西。如果我执行这个正则表达式 - 我是否得到信息或匹配包括我放在模式开头的单词?!喜欢:“BUS \d{12}”,我只想要数字,但知道 BUS 位于数字之前......

4

1 回答 1

1

您需要使用该Global选项,而不是Multiline. Multiline更改锚点 (^$) 的行为,使它们匹配每行的开头和结尾,而不仅仅是整个文本的开头和结尾。 Global是告诉它查找所有匹配项的选项,而不仅仅是第一个匹配项。

您可能也不需要使用 SubMatches 属性。您的正则表达式只有一个捕获组,它捕获整个匹配。这意味着m3.SubMatches将只包含一个项目,Item(0),它将与 完全相同m3.Item(0)。(请注意,第一组的索引是01与使用其他正则表达式工具时所期望的不同。)

您的第二个问题是 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 回答