如何使用正则表达式捕获跨越多行的模式?

时间:2019-02-07 20:28:10

标签: regex vb.net

请帮助。我已经阅读了数十篇Stack Overflow文章和在线教程,无法弄清楚!

我需要一个正则表达式,该表达式将返回跨越多行的匹配,并且我不确定该怎么做。例如,文字是

  

1)2019年1月11日上午11:04 RF HQCSQT

                    John Doe,Construction,555-555-5555,

2) 11-JAN-2019  1:42 PM  I   ADD  HQCSQT

                    John Doe/Construction Worker Request El
                    ectronic Add Wires: 7600SB=. Building c
                    odes: ,

3) 11-JAN-2019  1:54 PM  I   ADD  STM003

                    John Doe/Construction Worker Request El
                    ectronic Add Wires: 1430SBX=. Building
                    codes: ,

有两个匹配项应来自上述字符串,即第2行和第3行,直到逗号(“,”)为止。参见下面的匹配示例。

  

2)11-JAN-2019 1:42 PM I ADD HQCSQT

                    John Doe/Construction Worker Request El
                    ectronic Add Wires: 7600SB=. Building c
                    odes: ,

所以我想捕获以开头的正则表达式模式

^\d\)\s+\d\d-\w+-\d+\s+\d+:\d+\s+\w+\s+I\s+ADD\s+(HQCSQT|STM003)

并以

的正则表达式结尾
(,\s)$ 

注意:我测试了“(,\ s)$”,并且启用了多行选项后,行结束了。

2 个答案:

答案 0 :(得分:0)

您已经在那里。您不能正确设置正则表达式选项。您需要同时使用SingleLine和MultiLine模式。

Dim input As String = "
1) 11-JAN-2019 11:04 AM I RF HQCSQT

                    John Doe,Construction,555-555-5555,

2) 11-JAN-2019  1:42 PM  I   ADD  HQCSQT

                    John Doe/Construction Worker Request El
                    ectronic Add Wires: 7600SB=. Building c
                    odes: ,

3) 11-JAN-2019  1:54 PM  I   ADD  STM003

                    John Doe/Construction Worker Request El
                    ectronic Add Wires: 1430SBX=. Building
                    codes: ,
"
Dim pattern As String = "^\d\)\s+\d\d-\w+-\d+\s+\d+:\d+\s+\w+\s+I\s+ADD\s+(HQCSQT|STM003).*?,\s$"
Dim matches As Integer = Regex.Matches(input, pattern, RegexOptions.Multiline Or RegexOptions.Singleline).Count
Console.WriteLine(matches)  ' Outputs "2"

答案 1 :(得分:0)

似乎可以用双换行分隔:

Dim parts = Split(text, vbCrLf & vbCrLf)

For i = 0 To parts.Length Step 2
    Debug.Print(parts(i) & vbCrLf & vbCrLf & parts(i + 1) & vbCrLf & "------------")
Next