1

編集: 私の文字列がますます複雑になったため、が唯一の方法のように見えます。私はそれについて多くの経験がありません。あなたの助けに感謝します。

基本的に、Web で読んだものから、次の exp を作成して、サンプル文字列の一致を試みます。

「2012 年 3 月 12 日の私の非常に長い長い文字列は、2015 年 4 月 23 日にここにあります」[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

私の側では、文字列に有効な日付が含まれていると確信しているため、正規表現は簡単です。

thnxイリヤ

于 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 に答える