2016-10-12 3 views
0

Ich versuche, ein Muster zu entsprechen, und dann die nächsten 1-3 Zeilen nach dem Muster, wenn sie existieren. Ich weiß, dass ich etwas falsch zu machen, aber ich bin nicht sicher, was genau es ist:Alle Zeilen sowie das ursprüngliche Muster in VBA regex

Also, wenn die Zeichenfolge enthält:

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

(die Grammatikfehler ignorieren, muss ich die Tatsache zu übernehmen, Leute können nicht buchstabieren, aber können das "Wesentliche" davon richtig erhalten). Ich muss das bekommen, plus die nächsten 3 Zeilen. Im Moment bekomme ich nur den ersten Teil, der mit dem Zeitplan übereinstimmt.

((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 die oben genannten Arbeiten verwenden, aber in meinem Debug.Print ich bin immer nur den "Unser Zeitplan:" teil.

Lassen Sie mich den obigen Regex für die Klarheit brechen. Der Zeitplan Teil:

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

Die jeweils nachfolgenden Datumsgrenze, auf die Räume und zufällige Fehler:

((([\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} 

, die zwischen 01JAN17-02FEB17 oder 10 JAN 17 - 02 FEB 17 und alles wird passen.

Dies wird die richtige erste Zeile, so weiß ich, ich bin gut, weiß nur nicht, was ich noch vermisse.

Ich verwende jetzt den VBA-Code von der ersten Antwort zu testen, und immer noch nur den ersten Teil. Der VBA-Code, um das Spiel zu ziehen, ist wie folgt:

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 
+0

Ihr Ziel rumspielen kann, ist, die Daten zu bekommen? Warum zielst du nicht auf die Datumswerte? –

+0

Ich brauche sie, um die Daten zu sein, die spezifisch nach diesem Muster existieren, weshalb ich dieses Muster einschließe. Andere Daten existieren in diesem Dokument. – Nick

Antwort

1

Hat so etwas wie

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

Arbeit? Grundsätzlich kann diese Regex in aufgeteilt werden „OUR SKED“ OR „OURS ZEITPLAN:“ dann Bis zu drei Reihen von „TTMMMJJJJ - DDMMMYYYYY“

Sie müssen jedoch Ihre Daten zu sein, die DDMMMYYY Elemente ändern werden angezeigt (Ich weiß nicht, ob MMM "MAY" oder "MM" sein soll -> 05)

Ich legte Ihre Zeichenfolge (mit der Zeile Returns \ n) in Zelle (1,1) und verwendet der folgende Code

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 

Sie testen und mit regex auf einer Website wie RegExr

+0

Nahm, was du hattest, säuberte meine Regex. VBA gibt mir immer noch nichts nach der Einteilung, obwohl RegExr funktioniert. – Nick

+0

Markierte es als richtig, weil ich nur '([\ r \ n]) 'in' ([\ r \ n] {1,2}) '' ändern musste, um es zum Laufen zu bringen. DANKE! – Nick

+0

Cool! Freut mich zu hören, dass es für dich funktioniert hat. :) –