2015-01-23 4 views
2

Я новичок в VBA и хотел бы получить некоторую помощь в использовании RegEx, и я надеюсь, что как-то может просветить меня на том, что я делаю неправильно. В настоящее время я пытаюсь разделить дату на свою индивидуальную дату, месяц и год, а возможные разделители включают «,», «-» и «/».Разделение строки в VBA с использованием RegEx

Function formattedDate(inputDate As String) As String 

    Dim dateString As String 
    Dim dateStringArray() As String 
    Dim day As Integer 
    Dim month As String 
    Dim year As Integer 
    Dim assembledDate As String 
    Dim monthNum As Integer 
    Dim tempArray() As String 
    Dim pattern As String() 
    Dim RegEx As Object 

    dateString = inputDate 
    Set RegEx = CreateObject("VBScript.RegExp") 

    pattern = "(/)|(,)|(-)" 
    dateStringArray() = RegEx.Split(dateString, pattern) 

    ' .... code continues 

Это то, что я делаю сейчас. Однако во время функции RegEx.Split, похоже, что-то не так, поскольку, похоже, мои коды зависают и не обрабатываются дальше.

Чтобы просто подтвердить, я сделал что-то простое:

MsgBox("Hi") 
pattern = "(/)|(,)|(-)" 
dateStringArray() = RegEx.Split(dateString, pattern) 
MsgBox("Bye") 

«Привет» MsgBox высовывается, но «Bye» MsgBox никогда не получает выскочил, а коды дальше вниз, кажется, не получают excuted что привело к моему подозрению, что RegEx.Split заставляет его застревать.

Могу ли я проверить, действительно ли я использую RegEx.Split правильный путь? Согласно MSDN here, Split (String, String) также возвращает массив строк.

Спасибо!

Редактировать: Я пытаюсь не исследовать функцию CDate(), поскольку я стараюсь не зависеть от настроек языкового стандарта на компьютере пользователя.

+0

вам действительно нужно использовать 'RegEx' для этого? Будет ли «CDate» не соответствовать счету? – paul

+0

Во-первых, 'Split' не является методом Regex. Во-вторых, ссылка, которую вы связываете, - VB.Net, а не VBA. В SO на Regex в VBA есть много ответов, а также функция Split. –

+0

@paul Я стараюсь не зависеть от настроек локали на компьютере из-за некоторых сложных причин. Но как CDate поможет разбить его? – lyk

ответ

0

Цитирование пример из документации VBScript Regexp: https://msdn.microsoft.com/en-us/library/y27d2s18%28v=vs.84%29.aspx

Function SubMatchTest(inpStr) 
    Dim retStr 
    Dim oRe, oMatch, oMatches 
    Set oRe = New RegExp 
    ' Look for an e-mail address (not a perfect RegExp) 
    oRe.Pattern = "(\w+)@(\w+)\.(\w+)" 
    ' Get the Matches collection 
    Set oMatches = oRe.Execute(inpStr) 
    ' Get the first item in the Matches collection 
    Set oMatch = oMatches(0) 
    ' Create the results string. 
    ' The Match object is the entire match - [email protected] 
    retStr = "Email address is: " & oMatch & vbNewLine 
    ' Get the sub-matched parts of the address. 
    retStr = retStr & "Email alias is: " & oMatch.SubMatches(0) ' dragon 
    retStr = retStr & vbNewLine 
    retStr = retStr & "Organization is: " & oMatch.SubMatches(1) ' xyzzy 
    SubMatchTest = retStr 
End Function 

Чтобы проверить, звоните:

MsgBox(SubMatchTest("Please send mail to [email protected] Thanks!")) 

Короче говоря, вам нужен шаблон, чтобы соответствовать различные детали, которые требуется экстренный, со спирализаторами между ними, может быть, что-то вроде:

"(\d+)[/-,](\d+)[/-,](\d+)" 

Все будет в oMatch, в то время как числа (\ d) окажутся в oMatch.SubMatches (0) до oMatch.SubMatches (2).

6

Чтобы разбить строку с регулярным выражением в VBA:

Public Function SplitRe(Text As String, Pattern As String, Optional IgnoreCase As Boolean) As String() 
    Static re As Object 

    If re Is Nothing Then 
     Set re = CreateObject("VBScript.RegExp") 
     re.Global = True 
     re.MultiLine = True 
    End If 

    re.IgnoreCase = IgnoreCase 
    re.Pattern = Pattern 
    SplitRe = Strings.Split(re.Replace(text, ChrW(-1)), ChrW(-1)) 
End Function 

Пример использования:

Dim v 
v = SplitRe("a,b/c;d", "[,;/]") 
+1

приятные - но плохие результаты, если строка уже содержит символы 'vbNullChar'. – ThunderFrame