我已经用它来获取单行信息。我有一个信息列表,如:
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站在数字之前......
答案 0 :(得分:1)
您需要使用Global
选项,而不是Multiline
。 Multiline
更改了锚点(^
和$
)的行为,因此它们匹配每行的开头和结尾,而不仅仅是整个文本的开头和结尾。 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了解更多信息。