在stringvba excel中匹配date模式

编辑: 由于我的string变得越来越复杂看起来像正则expression式是唯一的方法。 我没有很多的经验,你的帮助是非常感谢。

基本上,从我在网上阅读的内容中,我构build了以下exp来尝试在我的示例string中匹配事件:

“我很长的一串12Mar2012就在这里23Apr2015”[0-9] [0-9] + [a-zA-Z] + [0-9] [0-9] [0-9] [0-9 ]

并尝试这个代码。 我没有任何匹配。 任何好的正则expression式教程链接非常赞赏。

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 

谢谢

感谢你的帮助 !!! 我设法解决我的问题使用这个简单的代码。

 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 

只要注意在我身边,我确定我在string中有有效的date,所以regexpression式很容易。

thnx伊利亚

此代码使用DateValueRegexpvalidation实际date以确保健壮性

 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 

以下是我所做的一个快速尝试。 这远非完美。

基本上,它把string分解成单词。 通过循环切换任何标点符号(句点和逗号,可能需要添加更多)。

在处理项目时,我们尝试从中删除每个月份的名称。 如果string变短,我们可能会有一个date。

它会检查最后一个string的长度是否正确(5或6个字符,date和年份是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