Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа со строками.docx
Скачиваний:
25
Добавлен:
26.09.2019
Размер:
66.22 Кб
Скачать

Сборка элементов массива в строку. Функция 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***