我想从像这样的字符串中解析出年份信息
$ 8995 2008年4月18日本田思域混合动力车8995美元(Orem)pic map cars&卡车 - 由所有者
由于我在线检索此字符串,有时年份元素不在同一个地方。我这样做的方法是使用split函数按空格分割字符串,然后检查数组的每个节点是否只包含数字。
但是当我使用函数IsNumeric时,它也返回“$ 8995”节点为true。
检查字符串是否仅包含数字,没有“$”,没有“。”而不是其他任何内容的好方法是什么?
或者在我的情况下,是否有更好的方法来检索年份信息?
感谢。
答案 0 :(得分: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
答案 1 :(得分:1)
这可以使用Like
运算符以单行代码的形式完成
Function StringIsDigits(ByVal s As String) As Boolean
StringIsDigits = Len(s) And (s Like String(Len(s), "#"))
End Function
答案 2 :(得分: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
答案 3 :(得分: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