VBA'ya Eşleme Tarihine Normal İfade

Normal İfadeler konusunda yeniyim ve VBScript/VBA'da çalışmak için çevrimiçi buldukları kalıpları bulmakta zorluk çekiyorum. Bu bir dizede bulunan bir tarihi döndürmesi gerekiyor, ancak herhangi bir tarih bulmak için başarısız oluyor. VBScript/VBA'nın, başka bir RegEx motorundan farklı olması, bunun bir eşleşme döndürmesini engelliyor mu?

Edit1
I removed the ^ and the $ from my pattern. The problem persists.

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
0

2 cevap

RegEx'iniz, yalnızca ona ilettiğiniz tüm dize bir tarihse eşleşmeyi bulacak gibi görünüyor.

Try removing ^ and $

Örneğiniz, tarihleri ​​mm/gg/yyyy ve aa-gg-yyyy biçimlerinde bulacağınız bir RegEx kullanarak yeniden işlenir.

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
6
katma
Büyük öneri ama bu sorunu çözmez.
katma yazar HK1, kaynak
Gerekli olan değişiklikler hakkında herhangi bir açıklama var mı? Ayrıca bu bulmayı (mm/gg/yyyy) veya (mm-gg-yyyy) nasıl yapacağınız hakkında herhangi bir fikir var mı?
katma yazar HK1, kaynak
Cevabınızı kod örneğinizde yeni bir RegEx ile güncelledim, çok spesifik olsa da emin değil misiniz?
katma yazar ipr101, kaynak
Zaten mm-dd-yyyy bulacaksınız, üzgünüm son yorumda koymuş olmalı
katma yazar ipr101, kaynak
Ayrıca, geçersiz tarihlerle de eşleşecek. 31 Şubat
katma yazar pastacool, kaynak

Neden tarih olarak görünen dizenin bir kısmını almak için RegEx'i kullanmayın ve IsDate Doğrulamak için İşlev?

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 biraz temizlenebilir, ancak mevcut örneğiniz için çalışıyor.

5
katma
Bu, tire ile ayrılmış tarihleri ​​bulabilir mi? Ama evet, bu durumda döndürülen diziyi test etmek kesinlikle sorun değil.
katma yazar HK1, kaynak
Desen güncellendi. tarih ayırıcıları için/veya eşleşecek.
katma yazar Rob Haupt, kaynak
Mükemmel cevap! Düzenli ifadelerle her zaman sorun yaşıyorum: -s
katma yazar keun, kaynak