我想从像这样的字符串中解析出年份信息

$ 8995 2008年4月18日,本田思域Hybrid $ 8995(Orem)图片地图车和卡车-由所有者

由于我是在线检索此字符串的,因此有时year元素不在同一位置。 我这样做的方法是使用拆分功能按空格拆分字符串,然后检查数组的每个节点是否仅包含数字。

但是,当我使用函数IsNumeric时,它也返回“ $ 8995”节点。

检查字符串是否仅包含数字,不包含“ $”,不包含“。”和其他任何内容的好方法是什么?

或者在我的情况下,是否有更好的方法来检索年份信息?

谢谢。

===============>>#1 票数:1

是否所有带有“ years”的字符串都具有看起来像日期的子字符串? 如果是这种情况,您可以在字符串中循环查找第一组三个日期类似的日期,然后从中提取年份:

Option Explicit
Function FindYear(S As String) As Long
    Dim SS As Variant
    Dim sDate As String
    Dim I As Long, J As Long

SS = Split(S, " ")
For I = 0 To UBound(SS) - 2
    sDate = ""
    For J = 0 To 2
        sDate = " " & sDate & " " & SS(I + J)
    Next J
    sDate = Trim(sDate)
    If IsDate(sDate) Then
        FindYear = Year(sDate)
        Exit Function
    End If
Next I
End Function

===============>>#2 票数:1

可以使用Like运算符以单行代码的形式完成此操作

Function StringIsDigits(ByVal s As String) As Boolean
    StringIsDigits = Len(s) And (s Like String(Len(s), "#"))
End Function

===============>>#3 票数:0

如果不使用正则表达式或一些非常复杂的逻辑,将很难做到完美。

该代码将返回纯数字子字符串,但在您的示例中,它将返回“ 18”和“ 2008”。 您显然可以尝试添加更多逻辑以禁止使用“ 18”(但允许使用“ 13”或“ 09”等,但是就像我说的那样开始变得复杂。我很乐意为您提供帮助,但不知道确切的含义是什么)您想,我认为最好现在就把它留给您。

Const str$ = "$8995 Apr 18 2008 Honda Civic Hybrid $8995 (Orem) pic map cars & trucks - by owner"
Option Explicit
Sub FindNumericValues()

Dim var() As String
Dim numbers As Variant

var = Split(str, " ")

numbers = GetNumerics(var)

MsgBox Join(numbers, ",")

End Sub

Function GetNumerics(words() As String) As Variant
Dim tmp() As Variant
Dim i As Integer
Dim n As Integer
Dim word As Variant
Dim bNumeric As Boolean

For Each word In words
    n = 0
    bNumeric = True
    Do While n < Len(word)
    n = n + 1
        If Not IsNumeric(Mid(word, n, 1)) Then
            bNumeric = False
            Exit Do
        End If
    Loop
    If bNumeric Then
        ReDim Preserve tmp(i)
        tmp(i) = word
        i = i + 1
    End If
Next

GetNumerics = tmp
End Function

===============>>#4 票数:0

您可以使用RegEx解析年份:

Public Function GetYear(someText As String) As Integer
    With CreateObject("VBScript.RegExp")
        .Global = False
        .MultiLine = False
        .IgnoreCase = True
        .Pattern = " [\d]{4} "
        If .Test(testString) Then
            GetYear = CInt(.Execute(testString)(0))
        Else
            GetYear = 9999
        End If
    End With
End Function

示例代码:

Public Const testString As String = "$8995 Apr 18 2008 Honda Civic Hybrid $8995 (Orem) pic map cars & trucks - by owner "

Public Function GetYear(someText As String) As Integer
    With CreateObject("VBScript.RegExp")
        .Global = False
        .MultiLine = False
        .IgnoreCase = True
        .Pattern = " [\d]{4} "
        If .Test(testString) Then
            GetYear = CInt(.Execute(testString)(0))
        Else
            GetYear = 9999
        End If
    End With
End Function

Sub Foo()
    Debug.Print GetYear(testString) '// "2008"
End Sub

  ask by TitanTheYaphet translate from so

未解决问题?本站智能推荐: