2011-10-28 167 views
0

我是新來的正則表達式,並且難以獲取我在網上找到的模式,以在VBScript/VBA中工作。這個應該返回一個在字符串中找到的日期,但它沒有找到任何日期。 VBScript/VBA與其他RegEx引擎不同,使其無法返回匹配項?VBA正則表達式匹配日期

編輯1
我從我的模式中刪除了^和$。問題依然存在。

Private Sub TestDate() 
    MsgBox RegExDate("cancel on 12/21/2010 ") 
End Sub 

Private Function RegExDate(s As String) As String 
    Dim re, match 
    Set re = CreateObject("vbscript.regexp") 
    re.Pattern = "(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))" 
    re.Global = True 

    For Each match In re.Execute(s) 
     MsgBox match.value 
     RegExDate = match.value 
     Exit For 
    Next 
    Set re = Nothing 
End Function 

回答

5

看起來您的RegEx只會在您傳遞給它的整個字符串是日期時纔會找到匹配項。

嘗試取出^$

下面是一個使用正則表達式將在MM/DD/YYYY和MM-DD-YYYY格式找到日期的例子返工 -

Private Sub TestDate() 
    MsgBox RegExDate("cancel on 12/21/2010 ") 
End Sub 

Private Function RegExDate(s As String) As String 
    Dim re, match 
    Set re = CreateObject("vbscript.regexp") 
    re.Pattern = "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}" 
    re.Global = True 

    For Each match In re.Execute(s) 
     MsgBox match.Value 
     RegExDate = match.Value 
     Exit For 
    Next 
    Set re = Nothing 
End Function 
+0

很棒的建議,但不能解決問題。 – HK1

+0

我已經更新了您的代碼示例中的新RegEx的答案,但不確定它是否過於具體? – ipr101

+0

關於所需更改的任何解釋?還有關於如何使其找到(mm/dd/yyyy)或(mm-dd-yyyy)的任何想法? – HK1

4

爲什麼不使用正則表達式獲取看起來是日期的字符串部分並使用IsDate函數來驗證它?

Function FormatOutput(s) 
    Dim re, match 
    Set re = CreateObject("vbscript.regexp") 
    re.Pattern = "[\d]+[\/-][\d]+[\/-][\d]+" 
    re.Global = True 

    For Each match In re.Execute(s) 
     if IsDate(match.value) then 
      FormatOutput = CDate(match.value) 
      Exit For 
     end if 
    Next 
    Set re = Nothing 

End Function 

RegEx可以被清除一點,但它適用於您當前的示例。

+0

這會找到用破折號分隔的日期嗎?但是,是的,測試返回的字符串在這種情況下肯定是OK的。 – HK1

+0

更新了模式。它將匹配/或 - 用於日期分隔符。 –

+0

很好的回答!總是遇到正則表達式的問題:-s – keun