簡體   English   中英

匹配字符串vba excel中的日期模式

[英]match date pattern in the string vba excel

編輯: 因為我的字符串變得越來越復雜,看起來像是唯一的方法。 我沒有太多的經驗,非常感謝你的幫助。

基本上從我在網上看到的,我構造了以下exp來嘗試在我的示例字符串中匹配出現:

“我的長長串12Mar2012就在這里23Apr2015”[0-9] [0-9] + [a-zA-Z] + [0-9] [0-9] [0-9] [0-9 ]

並嘗試此代碼。 我沒有任何比賽。 關於正則表達式教程的任何好的鏈接非常感謝。

  Dim re, match, RegExDate
    Set re = CreateObject("vbscript.regexp")
    re.Pattern = "(^[0-9][0-9] + [a-zA-Z] + [0-9][0-9][0-9][0-9]$)"
    re.Global = True

    For Each match In re.Execute(str)
        MsgBox match.Value
        RegExDate = match.Value
        Exit For
    Next

謝謝

此代碼使用DateValue驗證Regexp的實際日期是否具有健壯性

Sub Robust()
Dim Regex As Object
Dim RegexMC As Object
Dim RegexM As Object
Dim strIn As String
Dim BDate As Boolean
strIn = "My very long long string 12Mar2012 is right here 23Apr2015 and 30Feb2002"
Set Regex = CreateObject("vbscript.regexp")
With Regex
 .Pattern = "(([0-9])|([0-2][0-9])|([3][0-1]))(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\d{4})"
 .Global = True
If .test(strIn) Then
   Set RegexMC = .Execute(strIn)
   On Error Resume Next
   For Each RegexM In RegexMC
   BDate = False
   BDate = IsDate(DateValue(RegexM.submatches(0) & " " & RegexM.submatches(4) & " " & RegexM.submatches(5)))
   If BDate Then Debug.Print RegexM
   Next
   On Error GoTo 0
End If
End With
End Sub

感謝你的幫助 !!! 我設法使用這個簡單的代碼解決了我的問題。

Dim rex As New RegExp
Dim dateCol As New Collection
rex.Pattern = "(\d|\d\d)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\d{4})?"
rex.Global = True

For Each match In rex.Execute(sStream)
    dateCol.Add match.Value
Next

請注意,就我而言,我確信我在字符串中獲得了有效日期,因此reg表達式很容易。

thnx Ilya

以下是我的快速嘗試。 這遠非完美。

基本上,它將字符串拆分為單詞。 在循環顯示單詞時,它會切斷任何標點符號(句點和逗號,您可能需要添加更多標點符號)。

處理項目時,我們嘗試從中刪除每個月的名稱。 如果字符串變短,我們可能會有一個日期。

它會檢查最終字符串的長度是否正確(5或6個字符,1或2 + 4表示日期和年份)

您可以改為(或者)檢查是否有所有數字。

Private Const MonthList = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC"
Public Function getDates(ByVal Target As String) As String
Dim Data() As String
Dim Item As String
Dim Index As Integer
Dim List() As String
Dim Index2 As Integer
Dim Test As String
Dim Result As String

    List = Split(MonthList, ",")
    Data = Split(Target, " ")
    Result = ""

    For Index = LBound(Data) To UBound(Data)
        Item = UCase(Replace(Replace(Data(Index), ".", ""), ",", ""))
        For Index2 = LBound(Data) To UBound(Data)
            Test = Replace(Item, List(Index2), "")
            If Not Test = Item Then
                If Len(Test) = 5 Or Len(Test) = 6 Then
                    If Result = "" Then
                        Result = Item
                    Else
                        Result = Result & ", " & Item
                    End If
                End If
            End If
        Next Index2
    Next
    getDates = Result
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM