Регулярное выражение VBA для даты совпадения - PullRequest
0 голосов
/ 28 октября 2011

Я новичок в Регулярных выражениях, и мне трудно найти шаблоны, которые я нахожу в сети, для работы в VBScript / VBA.Предполагается, что он возвращает дату, найденную в строке, но не может найти никаких дат.Чем отличается VBScript / VBA от других движков RegEx, которые не позволяют вернуть совпадение?

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

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Выглядит так, как будто ваш RegEx найдет совпадение только в том случае, если вся передаваемая ему строка является датой.

Попробуйте удалить ^ и $

Вот ваш пример, переработанный с использованием RegEx, который будет искать даты в форматах мм / дд / гггг и мм-дд-гггг -

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
5 голосов
/ 28 октября 2011

Почему бы не использовать RegEx, чтобы получить часть строки, которая выглядит как дата, и использовать функцию 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 может быть очищеннемного, но это работает для вашего текущего примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...