2

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

8995 美元 2008 年 4 月 18 日 Honda Civic Hybrid 8995 美元(Orem)图片地图汽车和卡车 - 所有者

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

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

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

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

谢谢。

4

4 回答 4

3

Like这可以使用操作符作为单行代码来完成

Function StringIsDigits(ByVal s As String) As Boolean
    StringIsDigits = Len(s) And (s Like String(Len(s), "#"))
End Function
于 2018-10-06T23:07:56.110 回答
1

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

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
于 2014-04-20T06:13:10.700 回答
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
于 2014-04-20T02:06:17.957 回答
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
于 2018-10-06T23:18:20.963 回答