2014-04-03 15 views
6

Ich arbeite an dem Ersetzen schlecht formatierter Datumszeichenfolgen (und anderer Elemente) mithilfe von regulären VBA-Ausdrücken in Excel.VBA regulärer Ausdruck, ersetzt Gruppen

I Datum Strings zu ersetzen suchen, die die richtige YYYY-MMM-DD-Format haben, aber die dash Separatoren fehlen - Dinge wie:

2014,APRIL,04 or 
2014.Apr,04 or 
2014/Apr-04 

ich sie möchte wie eine von formatiert werden diese:

2014-Apr-04 
2014-April-04 

(dh hält das Jahr, Monat, Tag Elemente, wie sie zur Verfügung gestellt wurden, sondern einfach das ersetzen der Trennzeichen mit einem Bindestrich anstelle einem Komma, Punkt oder anderen seltsamen Zeichen)

Der Code, den ich derzeit habe, ist:

Dim RE As Object 
Set RE = CreateObject("vbscript.regexp") 
With RE 
    .Global = False ' Several occurrence to be found 
    .IgnoreCase = True 
    .Pattern = "(((19|20)[0-9]{2})[, /.]([a-zA-Z]+)[, /.](0[1-9]|[12][0-9]|3[01])[, /.])" 
End With 

Dim ReplacePattern As String 
ReplacePattern = "$1-$2-$3" 

Dim match As Boolean 
match = RE.Test(LogEntryTxt) 

LogEntryTxt = RE.Replace(LogEntryTxt, ReplacePattern) 

aber es scheint der Ersatz nicht richtig gemacht wird. Kann jemand helfen? Ich habe versucht, benannte Gruppen, nummerierte Gruppen usw. zu erforschen, aber nichts, was ich versucht habe, hat es geschafft.

Antwort

5

Ihre Ersetzungen werden durcheinander gebracht, weil Sie Gruppen um Teile der Übereinstimmung erfassen, die nicht $1-$2-$3 entsprechen, um eine JJJJ-MMM-DD zu erstellen. Sie können entweder Ihre aktuellen RegexMuster halten und $2-$4-$5 für den Ersatz verwenden oder einen eleganten Ansatz und die diese Gruppen ändern, die Sie später nicht in nicht-einfangenden Gruppen verweisen müssen:

(?:((?:19|20)[0-9]{2})[, /.]([a-zA-Z]+)[, /.](0[1-9]|[12][0-9]|3[01])[, /.]) ^^ ^^

Dann ersetzen Sie mit $1-$2-$3, wie Sie gerade tun.

+0

Vielen Dank !!!! Ich kann nicht glauben, dass ich so eine dumme Sache übersehen habe !!! :) Danke, wirklich. – user3477276