0

我有这段代码,我想用它来比较两个字符串。这个想法是获取一个单词的第一个字母和一个数字的最后四个并将它们放在一起,以便我可以将它与另一个进行比较。例如,如果我有“Smith John 123456”并且我想输入“s3456”,我应该能够找到它。

Dim strFileName, strTxtValue

strFileName = "4ABCD_Delta_Jhon_T_JR_123456"
strTxtValue = "D3456"

Dim item, items, firstInitial, lastFour, myArray

strFileName = replace(strFileName,"_"," ")
myArray = Split(strFileName)

For Each item In myArray
    If IsNumeric(item) Then
        lastFour = Right(item, Len(item)-2)
        Exit For
    End If
Next
For Each items In myArray
    firstInitial = Left(items, 1)&lastFour
    If UCase(strTxtValue) = UCase(firstInitial) Then
        Contains = True
    End If
Next

到目前为止,这就是我所拥有的,但我无法让它发挥作用。有人能帮帮我吗?

4

3 回答 3

2

鉴于您的第一个示例,获取第一个字母和最后四位数字很容易:

>> s = "Smith John 123456"
>> t = LCase(Left(s, 1)) & Right(s, 4)
>> WScript.Echo t, CStr(t = "s3456")
>>
s3456 True

如果您的输入更加多样化,例如“4ABCD_Delta_Jhon_T_JR_123456”等文件名,则可能需要使用正则表达式或创造性地使用拆分。让我们从:

>> s = "4ABCD_Delta_Jhon_T_JR_123456"
>> s = Split(s, "_", 2)(1)
>> t = LCase(Left(s, 1)) & Right(s, 4)
>> WScript.Echo t, CStr(t = "d3456")
>>
d3456 True
>>

这显然取决于作为输入的第二块的名称。

如果您提供一些更具代表性的输入样本,我愿意考虑使用 RegExp 解决方案。

于 2013-04-07T12:37:25.633 回答
1

另一种方法是使用正则表达式:

s = "Smith John 123456"

Set re = New RegExp
re.Pattern = "^(.).*(.{4})$"

WScript.Echo LCase(re.Replace(s, "$1$2"))

对于第二个示例,如下所示:

s = "4ABCD_Delta_Jhon_T_JR_123456"

Set re = New RegExp
re.Pattern = "^(?:\w*?[0-9]\w*?_)?([a-z])[a-z]*_.*(.{4})$"
re.IgnoreCase = True

WScript.Echo LCase(re.Replace(s, "$1$2"))
于 2013-04-07T19:14:53.407 回答
1

另一种选择:

strFileName = "4ABCD_Delta_Jhon_T_JR_123456"
strTxtValue = "D3456"
strFromName = ""
myArray     = Split(strFileName, "_")
For i = 0 To UBound(myArray)
    firstChar = Asc(myArray(i))
    'if not a number...
    If firstChar < 48 Or firstChar > 57 Then
        strFromName = Chr(firstChar)
        Exit For
    End If
Next
strFromName = strFromName & Right(strFileName, 4)
WScript.Echo strFromName, CStr(strFromName = strTxtValue)
'>> D3456 True
于 2013-04-07T21:29:33.990 回答