2014-04-03 12 views
6

Pracuję nad zastąpieniem źle sformułowanych ciągów znaków daty (i innych elementów) za pomocą wyrażeń regularnych VBA w programie Excel.Wyrażenie regularne VBA, zastępowanie grup

szukam zastąpić date ciągi, które mają właściwy format YYYY-MMM-DD, ale brakuje separatorów kreskami - takie rzeczy jak:

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

bym je lubią być sformatowany jak któryś z te:

2014-Apr-04 
2014-April-04 

(czyli utrzymanie rok, miesiąc, dzień jak elementy zostały dostarczone, ale po prostu zastępując ograniczniki z myślnikiem, a nie przecinek, kropka lub innych dziwnych znaków)

Kod ja obecnie mam to:

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) 

ale wydaje się, że wymiana nie jest wykonane prawidłowo. Czy ktoś może pomóc? Próbowałem badać nazwane grupy, ponumerowane grupy itp., Ale nic, co próbowałem, nie dokonało tego.

Odpowiedz

5

Twoje zamienniki są pomieszane, ponieważ przechwytujesz grupy wokół części meczu, które nie odpowiadają $1-$2-$3, aby utworzyć RRRR-MMM-DD. Można też zachować swój aktualny wzór regex i używać $2-$4-$5 na wymianę, lub przyjąć bardziej eleganckie podejście i zmieniać grupy schwytania, nie trzeba odwoływać później do przechwytywania spoza grupy:

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

Następnie zamień na $1-$2-$3, tak jak obecnie.

+0

Dziękuję !! Nie mogę uwierzyć, że przeoczyłem taką głupią rzecz! :) Dziękuję, naprawdę. – user3477276