用于多行匹配的VB中的RegEx模式

时间:2012-09-12 06:52:55

标签: regex vb.net

我已经用它来获取单行信息。我有一个信息列表,如:

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站在数字之前......

1 个答案:

答案 0 :(得分:1)

您需要使用Global选项,而不是MultilineMultiline更改了锚点(^$)的行为,因此它们匹配每行的开头和结尾,而不仅仅是整个文本的开头和结尾。 Global是一个选项,可以让它找到所有匹配项,而不仅仅是第一个。

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

您的第二个问题是SubMatches属性的来源。如果您想查找“BUS”后面的每个12位数字,您可以使用这样的正则表达式:

BUS\s*(\d{12})

...你会从每个匹配中检索出这样的数字:

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

See this page了解更多信息。