[英]match date pattern in the string vba excel
編輯: 因為我的字符串變得越來越復雜,看起來像regexp是唯一的方法。 我沒有太多的經驗,非常感謝你的幫助。
基本上從我在網上看到的,我構造了以下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.