【问题标题】:How do I get the last four and the first character?我如何获得最后四个和第一个字符?
【发布时间】:2013-04-08 16:29:58
【问题描述】:

我有这段代码,我想用它来比较两个字符串。这个想法是获取一个单词的第一个字母和一个数字的最后四个并将它们放在一起,以便我可以将它与另一个进行比较。例如,如果我有“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

到目前为止,这就是我所拥有的,但我无法使其工作。有人可以帮帮我吗?

【问题讨论】:

  • item最右边的四个字符就是“Right(item, 4)”。

标签: vbscript


【解决方案1】:

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

>> 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”这样的文件名, 那么可能需要使用 RegExp 或创造性地使用 Split。让我们开始吧:

>> 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 解决方案。

【讨论】:

  • 谢谢 ekkehard,我遇到的问题是 s 可能是“4ABCD_Delta_Jhon_T_JR_123456”或这个“Delta_Jhon_T_JR_123456”
【解决方案2】:

另一种选择:

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

【讨论】:

  • 这正是我一直在寻找的,谢谢,感谢你们摇滚的其他人
【解决方案3】:

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

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"))

【讨论】:

  • 谢谢 ansgar 我尝试使用正则表达式,但 s 值可以是这个 s = "4ABCD_Delta_Jhon_T_JR_123456" 或 s = "Delta_Jhon_T_JR_123456",那么你是怎么做的
猜你喜欢
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2020-12-27
  • 2023-02-10
相关资源
最近更新 更多