获取所有行以及VBA正则表达式中的初始模式

时间:2016-10-12 11:50:01

标签: vba ms-access

我正在尝试匹配一个模式,然后在该模式之后获得接下来的1-3行(如果它们存在)。我知道我做错了什么,但我不确定它究竟是什么:

所以如果字符串包含:

OUR SKED
or 
OURS SCHEDULE:
01JAN14-24FEB16
26FEB17-17FEB18
19MAR16 - 24DEC28

(忽略语法错误,我需要结合一个事实,即人们不能拼写,但可能会得到正确的“要点”)。 我需要得到它,加上接下来的3行。现在我只得到第一部分匹配计划。

((OUR[S]{0,1} S[KCH]{1,2}ED(ULE){0,1})[:]{1})((([\r\n])([0-9]{2}[\s]{0,1}[A-Z]{3}[0-9]{2}[\s]{0,1}-[\s]{0,1}[0-9]{2}[\s]{0,1}[A-Z]{3}[0-9]{2})|)|){0,3}

使用RegExr上述作品,但在我的Debug.Print中,我只是得到了“我们的时间表:”部分。

为了清楚起见,让我打破上面的正则表达式。时间表部分:

((OUR[S]{0,1} S[KCH]{1,2}ED(ULE){0,1})[:]{1})

每个后续日期行,计算空格和随机错误:

((([\r\n])([0-9]{2}[\s]{0,1}[A-Z]{3}[0-9]{2}[\s]{0,1}-[\s]{0,1}[0-9]{2}[\s]{0,1}[A-Z]{3}[0-9]{2})|)|){0,3}

这将匹配01JAN17-02FEB1710 JAN 17 - 02 FEB 17以及介于两者之间的所有内容。

这得到正确的第一行,所以我知道我很好,只是不知道我还缺少什么。

我现在正在使用第一个答案中的VBA代码进行测试,但仍然只获得第一部分。拉取匹配的VBA代码如下:

Public Function StripPatternMatchingRegex2(ByVal valueToTest As String, ByVal expression As String) As Variant
Dim regex As New RegExp
Dim results As Variant
Dim allmatches As Object
If valueToTest <> "" Then
    With regex
        .Global = True
        .Multiline = True
        .IgnoreCase = False
        .Pattern = expression
    End With
    ' Debug.Print expression
    If regex.test(valueToTest) Then
        Set StripPatternMatchingRegex2 = regex.Execute(valueToTest)
    Else
        Set StripPatternMatchingRegex2 = Nothing
    End If
End If
End Function

1 个答案:

答案 0 :(得分:1)

喜欢

(OUR SKED|OURS SCHEDULE:)((([\r\n]{1,2})(DDMMMYYYY - DDMMMYYYY)|)|){0,3}

工作? 基本上,这个正则表达式可以拆分成 “我们的SKED”或“我们的日程安排:” 然后 最多三行“DDMMMYYYY - DDMMMYYYYY”

您需要更改DDMMMYYY项目,但是您的日期会显示(我不知道MMM是“MAY”还是应该是“MM” - &gt; 05)

我把你的字符串(行返回\ n)放在单元格(1,1)中并使用以下代码。

Sub Test()

Dim results As Variant
Dim i As Integer
Set results = StripPatternMatchingRegex(Cells(1, 1), "(OUR SKED|OURS SCHEDULE:)((([\r\n])(DDMMMYYYY - DDMMMYYYY)|)|){0,3}")
For i = 0 To results.Count - 1
    Debug.Print results.Item(i).Value
Next i

End Sub

Public Function StripPatternMatchingRegex(ByVal valueToTest As String, ByVal expression As String) As Variant
Dim regex As New RegExp
Dim results As Variant
Dim allmatches As Object
If valueToTest <> "" Then
    With regex
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = expression
    End With
    ' Debug.Print expression
    If regex.Test(valueToTest) Then
        Set StripPatternMatchingRegex = regex.Execute(valueToTest)
    Else
        Set StripPatternMatchingRegex = Nothing
    End If
End If
End Function

您可以在RegExr

等网站上测试和使用正则表达式