- •Сравнение с образцом
- •Основные операции над строками
- •Функция InStrRev - поиск последнего вхождения подстроки
- •Функция Replace - замена всех вхождений подстроки
- •Удаление подстроки
- •Разбор строки. Функции Split, Join и Filter
- •Преобразование строки в массив. Функция Split
- •Сборка элементов массива в строку. Функция Join
- •Фильтрация элементов массива. Функция Filter
- •Замена разных символов строки. Функция CharSetReplace
- •Фильтрация, основанная на шаблоне. Функция WildFilter
- •Разбор строки, допускающей разные разделители ее элементов. Функция WildSplit
Сборка элементов массива в строку. Функция Join
Функция Join решает обратную задачу, - она восстанавливает строку по ее элементам, хранящимся в массиве, добавляя разделители в момент их объединения. Ее синтаксис:
Join(sourcearray[, delimiter])
Если необязательный аргумент delimiter опущен, то элементы разделяются пробелами. В качестве примера, приведем обратную сборку сложного предложения:
Public Sub SplitAndJoin()
'В этой процедуре сложное предложение разделяется на простые
'А затем после обработки строка восстанавливается
'Объявляем динамический массив
Dim Simple() As String, i As Byte
Dim Simple1() As String, Res As String
'Размерность массива Simple устанавливается автоматически
'в соответствии с размерностью массива, возвращаемого функцией Split
Simple = Split("А это пшеница, которая в темном чулане хранится в доме, " _
& "который построил Джек", ", ")
'Создаем новый массив
ReDim Simple1(1 To UBound(Simple) + 2)
Simple1(1) = "А это веселая птица - синица"
Simple1(2) = "которая часто ворует пшеницу"
For i = 3 To UBound(Simple1)
Simple1(i) = Simple(i - 2)
Next i
'Создаем строку из массива Simple1
Res = Join(Simple1, ", ")
Debug.Print Res
End Sub
Результат отладочной печати:
А это веселая птица - синица, которая часто ворует пшеницу, которая в темном
чулане хранится в доме, который построил Джек
Фильтрация элементов массива. Функция Filter
Функция Filter является одним из вариантов поиска по образцу среди элементов массива. Здесь не требуется точного совпадения элемента и образца, достаточно, чтобы строка - образец содержалась в строке, заданной элементом массива. Поскольку совпадений может быть достаточно много, то результатом является массив отфильтрованных элементов. Некоторые детали будут пояснены при описании аргументов функции Filter. Вот ее синтаксис:
Filter(sourcearray, match[, include[, compare]])
Ее параметры имеют следующий смысл:
sourcearray - одномерный массив, элементы которого являются строками. Он может быть получен, например, как результат расщепления строки в массив.
match - образец поиска. Строка, вхождение которой ищется в каждом элементе исходного массива.
include - необязательный аргумент булевого типа. По умолчанию имеет значение True, означающее, что элементы, удовлетворяющие образцу, входят в результирующий массив. Если задано значение False, то результирующий массив составляется из элементов, не удовлетворяющих образцу.
compare - имеет обычный смысл.
В качестве результата возвращается массив отфильтрованных элементов.
Наш пример будет представлять расширенный вариант уже приводившейся процедуры SplitAndJoin:
Public Sub SplitAndJoin()
'В этой процедуре сложное предложение разделяется на простые
'А затем после обработки строка восстанавливается
'Здесь же демонстрируется фильтрация элементов массива
'Объявляем динамический массив
Dim Simple() As String, i As Byte
Dim Simple1() As String, Res As String
Dim Simple2() As String
'Размерность массива Simple устанавливается автоматически
'в соответствии с размерностью массива, возвращаемого функцией Split
Simple = Split("А это пшеница, которая в темном чулане хранится в доме, " _
& "который построил Джек", ", ")
'Создаем новый массив
ReDim Simple1(1 To UBound(Simple) + 2)
Simple1(1) = "А это веселая птица - синица"
Simple1(2) = "которая часто ворует пшеницу"
For i = 3 To UBound(Simple1)
Simple1(i) = Simple(i - 2)
Next i
'Создаем строку из массива Simple1
Res = Join(Simple1, ", ")
Debug.Print Res
'Фильтрация элементов массива
Simple2 = Filter(Simple1, "котор")
Res = Join(Simple2, ", ")
Debug.Print Res
Simple2 = Filter(Simple1, "котор", False)
Res = Join(Simple2, ", ")
Debug.Print Res
End Sub
Результаты отладочной печати:
А это веселая птица - синица, которая часто ворует пшеницу, которая в темном
чулане хранится в доме, который построил Джек
которая часто ворует пшеницу, которая в темном чулане хранится в доме,
который построил Джек
А это веселая птица - синица
Несколько модификаций встроенных функций
Мы приведем вариации стандартных функций Replace, Filter и Split.
Несмотря на то, что уже один вариант функции Replace приведен, мы разработали еще два варианта. Оба они отражают часто возникающую необходимость производить замену, основанную не на точном совпадении, а на совпадении с шаблоном, как это делается в операции Like. Эти функции позволяют разные подстроки заменять одним и тем же новым содержимым.
Замена, основанная на шаблоне. Функция WildReplace
Важным частным случаем, когда легко реализовать замену, основанную на шаблоне, представляют строки, допускающие разбор их на элементы. В этом случае алгоритм замены понятен, - строка разбирается на элементы, используя новые возможности, предоставляемые функцией Split; затем к каждому элементу применяется операция Like для сравнения с шаблоном; на последнем шаге применяется Join для восстановления строки. Приведем текст нашей функции:
Public Function WildReplace(ByVal expr As String, ByVal find As String, _
ByVal Rep As String, Optional ByVal delimiter As String = " ") As String
'Эта функция применима в том частном случае, когда строка - источник, заданная ' аргументом Expr представляет совокупность элементов, отделяемых разделителями.
'Типичный пример - строка представляет совокупность слов, разделенных пробелами.
'Как и обычная функция Replace эта функция производит замену вхождений элемента ' (подстроки) новым значением
'Отличие от стандартной функции состоит в том, что заменяемый элемент (подстрока) find
'задается шаблоном. В результате разные элементы могут быть заменены на новое значение.
'Для этого частного случая WildReplace существенно расширяет стандартные возможности ' Replace
'Алгоритм основан на том факте, что строка допускает разбор ее на элементы,
'а к элементам применима операция Like - сравнения с шаблоном.
Dim Words() As String, i As Long, Res As String
'Разбор строки на элементы
Words = Split(expr, delimiter)
'Сравнение элементов с шаблоном и замена в случае совпадения
For i = LBound(Words) To UBound(Words)
If Words(i) Like find Then Words(i) = Rep
Next i
'Сборка строки
Res = Join(Words, delimiter)
WildReplace = Res
End Function
Параметры этой функции имеют тот же смысл, что и для стандартной функции Replace. Существенное отличие состоит в том, что специальные символы шаблона допустимы в строке поиска find. Приведем теперь тестовую процедуру, осуществляющую вызов функции WildReplace:
Public Sub testWildReplace()
Dim Inf As String, SecretInf As String
Inf = "Agent001, Agent007, Агент Майор Пронин, Agent008"
SecretInf = WildReplace(Inf, "Agent###", "Agent***", ", ")
Debug.Print SecretInf
End Sub
Вот результаты ее работы:
Agent***, Agent***, Агент Майор Пронин, Agent***