Regex 要匹配日期的VBA正则表达式

Regex 要匹配日期的VBA正则表达式,regex,vba,vbscript,Regex,Vba,Vbscript,我不熟悉正则表达式,很难获取在线找到的模式,以便在VBScript/VBA中工作。这个函数应该返回在字符串中找到的日期,但它找不到任何日期。VBScript/VBA与其他正则表达式引擎有什么不同之处,使其无法返回匹配 Edit1 我从图案中删除了“^”和$。问题依然存在 Private Sub TestDate() MsgBox RegExDate("cancel on 12/21/2010 ") End Sub Private Function RegExDate(s As Stri

我不熟悉正则表达式,很难获取在线找到的模式,以便在VBScript/VBA中工作。这个函数应该返回在字符串中找到的日期,但它找不到任何日期。VBScript/VBA与其他正则表达式引擎有什么不同之处,使其无法返回匹配

Edit1
我从图案中删除了“^”和$。问题依然存在

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

似乎只有当传递给正则表达式的整个字符串是日期时,它才会找到匹配项

尝试删除
^
$

下面是使用正则表达式重新编写的示例,该正则表达式将以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

为什么不使用正则表达式获取字符串中显示为日期的部分,并使用函数对其进行验证

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

正则表达式可以稍微清理一下,但它适用于您当前的示例。

很好的建议,但这并不能解决问题。我已在您的代码示例中使用新的正则表达式更新了答案,但不确定它是否太具体?是否有关于所需更改的解释?还有关于如何查找(mm/dd/yyyy)或(mm-dd-yyyy)的想法吗?它将已经查找到mm-dd-yyyy,抱歉,应该在最后的注释中指出,这也将匹配无效日期,例如2月31日。这将查找以破折号分隔的日期吗?但是是的,在这种情况下测试返回的字符串当然可以。更新了模式。它将匹配日期分隔符的on/or。答案很好!正则表达式总是有问题:-s