- •Сравнение с образцом
- •Основные операции над строками
- •Функция InStrRev - поиск последнего вхождения подстроки
- •Функция Replace - замена всех вхождений подстроки
- •Удаление подстроки
- •Разбор строки. Функции Split, Join и Filter
- •Преобразование строки в массив. Функция Split
- •Сборка элементов массива в строку. Функция Join
- •Фильтрация элементов массива. Функция Filter
- •Замена разных символов строки. Функция CharSetReplace
- •Фильтрация, основанная на шаблоне. Функция WildFilter
- •Разбор строки, допускающей разные разделители ее элементов. Функция WildSplit
Функция InStrRev - поиск последнего вхождения подстроки
Функция InStrRev симметрично дополняет функцию InStr, аналогично тому, как функция Right дополняет функцию Left. Эта функция ищет вхождение подстроки в строку, но начинает свою работу с правого конца строки. Ее использование может существенно ускорить работу, если заранее известно, что искомая подстрока находится где-то в конце строки-источника. Если вхождение искомой подстроки единственно, то обе функции дают один и тот же результат. При множественном вхождении функция InStr возвращает первое вхождение, в то время как InStrRev - последнее. Ее синтаксис:
InstrRev(stringcheck, stringmatch[, start[, compare]])
Ее параметры имеют тот же смысл, что и у функции InStr, но порядок их задания изменен. Необязательный параметр Start задается третьим по счету. Когда он опущен, то, по умолчанию, его значение равно "-1", и поиск начинается с последнего символа. Если вернуться к последнему примеру, то для решения нашей содержательной задачи требовалось определить первое и последнее вхождение символа "\" в строке, задающей путь к файлу. Поэтому обе функции были весьма кстати. Нужно отметить, что это весьма типичная ситуация при разборах текста.
Функция Replace - замена всех вхождений подстроки
Позволяет заменить не только первое вхождение искомой подстроки, но и все такие вхождения, не требуя организации цикла. С другой стороны, можно ограничиться только заменой первого или нескольких первых вхождений. Рассмотрим синтаксис появившейся функции:
Replace(expression, find, replace[, start[, count[, compare]]])
Первый аргумент expression задает строковое выражение, результат которого определяет строку-источник, в которой осуществляется замена. Аргументы find и Replace задают заменяемую подстроку и ее новое значение. Аргумент Count определяет число замен. Обычно он равен 1, когда речь идет о замене первого вхождения, или опускается, - в этом случае его значение по умолчанию равно "-1", означающее замену всех вхождений. Аргумент compare имеет обычный смысл.
В качестве примера приведем функцию Rep. При копировании программного текста в документ Word появляются последовательности пробелов, отражающие структурную запись процедур и функций. Но появление в документах Word двух пробелов подряд считается смертельным грехом. Заменять пробелы табуляцией можно и руками, но, конечно же, лучше написать макрос, решающий эту и другие задачи по приведению текста в форму, требуемую редакцией. Вот текст функции, используемой для этих целей:
Public Sub Rep()
'Эта процедура преобразует выделенный программный текст
'Заменяя пробелы табуляцией и конец абзаца мягким концом строки
Dim TxtRange As String
TxtRange = Selection.Range.Text
'Замена пробелов: 4-х, 3-х и 2-х символом табуляции
TxtRange = Replace(TxtRange, " ", vbTab)
TxtRange = Replace(TxtRange, " ", vbTab)
TxtRange = Replace(TxtRange, " ", vbTab)
'Замена концов абзаца
Selection.Range.Text = Replace(TxtRange, VBA.Chr(13), VBA.Chr(11))
End Sub
У Replace есть одна особенность, на которую следует обратить внимание, - возвращаемый ею результат, начинается не с первой позиции, а с позиции, заданной аргументом Start. Так что помимо своей основной роли она еще обрубает голову строки, если только Start, отличается от 1. Поскольку замену зачастую нужно производить не с самого начала, а получать хочется полную строку, то мы написали свой вариант этой функции:
Public Function MyReplace(ByVal Expr As String, ByVal find As String, _
ByVal rep As String, Optional ByVal start As Long = 1, Optional
ByVal count As Long = -1, _
Optional ByVal compare As VbCompareMethod = vbBinaryCompare) As String
'Вызов стандартной функции Replace
If start = 1 Then
MyReplace = replace(Expr, find, rep, start, count, compare)
Else
MyReplace = VBA.Left(Expr, start - 1) & replace(Expr, find,
rep, start, count, compare)
End If
End Function
Вот результаты нескольких вызовов Replace и MyReplace в окне отладки:
? Replace("A+B *(D*B +B)","B","C",4,1)
*(D*C +B)
? MyReplace("A+B *(D*B +B)","B","C",4,1)
A+B *(D*C +B)
? MyReplace("A+B *(D*B +B)","B","C",4)
A+B *(D*C +C)