1

编辑: 由于我的字符串变得越来越复杂,看起来正则是唯一的方法。我在这方面没有太多经验,非常感谢您的帮助。

基本上,根据我在网上阅读的内容,我构建了以下 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

谢谢

4

3 回答 3

3

此代码验证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-15T23:52:44.493 回答
1

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

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-15T16:44:51.717 回答
0

以下是我进行的快速尝试。它远非完美。

基本上,它将字符串拆分为单词。在遍历单词时,它会切断任何标点符号(句号和逗号,您可能需要添加更多)。

在处理一个项目时,我们会尝试从中删除每个月的名称。如果字符串变短,我们可能会有一个日期。

它检查最终字符串的长度是否正确(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
于 2013-03-14T21:08:55.273 回答