2013-04-07 4 views
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 

До сих пор это то, что у меня есть, но я не могу заставить его работать. Может кто-нибудь, пожалуйста, помогите мне?

+1

Пра- большинство четырех символов элемента просто «Правильно (элемент, 4)». – phatfingers

ответ

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 
+0

это именно то, что я искал спасибо, и спасибо всем, кого вы, ребята, рок – user1766952

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», , может потребоваться использование 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.

+0

спасибо Ekkehard проблемы, я имею что s может быть «4ABCD_Delta_Jhon_T_JR_123456» или это «Delta_Jhon_T_JR_123456» – user1766952

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

спасибо Ansgar я пытаюсь использовать регулярное выражение, но значение s может может быть это S = «4ABCD_Delta_Jhon_T_JR_123456» или S = ​​«Delta_Jhon_T_JR_123456 ", так как вы это делаете – user1766952

+0

См. обновленный ответ. –