编辑:,因为我的字符串变得越来越复杂,看起来像/问题/标记/正则表达式是唯一的方法。我在这方面没有太多的经验,你的帮助是非常感谢的。
基本上,根据我在web上所读到的内容,我构造了下面的exp以尝试在我的示例字符串中匹配:
“我的超长字符串2012年3月12日就在这里2015年4月23日”0-9 + a-zA-Z + 0-90-9
试着用这个密码。我没有匹配的。任何关于regexp教程的好链接都非常感谢。
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谢谢
发布于 2013-03-15 23:52:44
此代码使用Regexp验证来自DateValue的实际日期,以增强健壮性。
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发布于 2013-03-15 16:44:51
谢谢你的帮助!我用这个简单的代码解决了我的问题。
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表达式很简单。
伊利亚
发布于 2013-03-14 21:08:55
下面是我所做的一个快速尝试。这还远远不够完美。
基本上,它把字符串分成几个字。在循环遍历单词时,它会切断任何标点符号(句号和逗号,您可能需要添加更多)。
在处理项目时,我们尝试从其中删除每个月的名称。如果字符串变短,我们可能会有个约会。
它检查最后字符串的长度是否正确(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 Functionhttps://stackoverflow.com/questions/15419652
复制相似问题