Основные операции над строками — КиберПедия 

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Основные операции над строками

2020-08-21 46
Основные операции над строками 0.00 из 5.00 0 оценок
Заказать работу

Работа со строками

Работать с текстами программисту, как правило, приходится чаще, чем работать с числами. Поэтому следует хорошо представлять основные базисные операции над строками, которые в большинстве случаев реализуются с помощью встроенных функций.

Сравнение строк

Обычные операции сравнения применимы и к строковым данным. Интерпретация этих операций зависит от установки опции Option Compare.

· Если эта опция установлена как Text, то сравнение на «больше – меньше» представляет лексикографическое сравнение, когда строки сравниваются по их расположению в словаре. Это сравнение не чувствительно к регистру, так что большие и малые буквы не различаются. Сравнение строк означает сравнение кодов их символов, так что лексикографический порядок определяется кодировкой символов алфавита.

· Если эта опция установлена как Binary, то сравнение идет побитно. В этом случае сравнение чувствительно к регистру.

Если нужно локально переопределить вид сравнения, заданный опцией для всего модуля, то можно использовать встроенную функцию StrComp, которая возвращает результат сравнения строк.

Ее синтаксис:

StrComp(string1, string2[, compare])

Аргументы string1 и string2 - сравниваемые строки. Необязательный аргумент compare указывает способ сравнения строк: значение по умолчанию 0 используется, чтобы выполнить двоичное сравнение, 1 задает посимвольное сравнение без учета регистра.

Если string1 меньше чем string2, то результат равен -1, если строки равны, то - 0, если вторая меньше, то - 1, если хоть одна из строк имеет значение Null, то результат также равен Null.

Сравнение с образцом

Полезным средством при работе с текстами является операция Like, задающая сравнение с образцом. Необходимость нахождения в наборе всех строк, удовлетворяющих некоторому шаблону (образцу), возникает в разных задачах. VBA позволяет решать ее в одну операцию. Приведем таблицу специальных символов, допустимых при задании образца.

Таблица 1. Специальные символы, используемые при задании шаблона

Символы Интерпретация Примеры
* Любой текст - произвольное число символов Шаблону Agent* соответствуют все тексты, начинающиеся со слова Agent. Строки Agent007 и Agent Майор Пронин удовлетворяют шаблону.
? Один любой символ Шаблону К?к удовлетворяют, в частности строки Кок и Кук.
# Любая цифра от 0 до 9 Шаблону Agent### соответствуют 1000 различных строк, среди которых и Agent007, но, конечно же, не Agent Майор Пронин.
[множество_символов] Любой символ, принадлежащий множеству Задать множество можно с помощью перечисления и интервалов. Шаблону К[аоу]к удовлетворяют слова "Как", "Кок", "Кук". Чувствительность к регистру зависит от установки опции Option Compare.
[!множество_символов] Любой не принадлежащий множеству символ Шаблону [!а-я] удовлетворяет символ, не являющийся буквой русского алфавита.

Приведем пример работы с операцией Like:

Public Sub LikeOperation()

Const pat1 = "[A-Z]"

Const pat2 = "[a-z]"

Const pat3 = "[!a-z]"

Const pat4 = "[3-5]"

Dim res As Byte

Dim Sym As String

 

res = "Кук" Like "К[аоу]к"

Debug.Print res

 

res = "f" Like pat1

Debug.Print res

res = "f" Like pat2

Debug.Print res

res = "f" Like pat3

Debug.Print res

 

res = "5" Like pat4

Debug.Print res

Sym = "3"

res = Sym Like pat1 & pat4

Debug.Print res

res = Sym Like pat1 Or Sym Like pat4

Debug.Print res

 

End Sub

 

Результаты отладочной печати:

255

 0

 255

 0

 255

 0

 255

В двух последних результатах, демонстрируются некорректный и корректный способы работы с объединением множеств проверяемых символов.

Удаление подстроки

Удаление вхождений подстроки в строку также является одной из основных операций над строками. Хотя специальной встроенной функции DelStr не появилось, но написать ее реализацию, имея Replace, совсем просто. Удалить подстроку эквивалентно замене ее пустой подстрокой. Вот текст, написанной нами функции DelStr:

Public Function DelStr(ByVal Expr As String, ByVal find As String, _

          Optional ByVal start As Long = 1, Optional ByVal count As Long = -1, _

          Optional ByVal compare As VbCompareMethod = vbBinaryCompare)

       

   'Вызов функции MyReplace с пустой строкой для замены

   DelStr = MyReplace(Expr, find, "", start, count, compare)

End Function

 

Приведем результаты ее вызовов в окне отладки:

? DelStr("T* + U** - V*","*")

T + U - V

? DelStr("T* + U** - V*","*",5)

T* + U - V

? DelStr("T* + U** - V*","*",5,1)

T* + U* - V*

Заметьте, при определении DelStr мы предпочли пользоваться собственной модификацией MyReplace, поскольку, как нам кажется, она в большей степени отвечает сути дела.

Работа со строками

Работать с текстами программисту, как правило, приходится чаще, чем работать с числами. Поэтому следует хорошо представлять основные базисные операции над строками, которые в большинстве случаев реализуются с помощью встроенных функций.

Сравнение строк

Обычные операции сравнения применимы и к строковым данным. Интерпретация этих операций зависит от установки опции Option Compare.

· Если эта опция установлена как Text, то сравнение на «больше – меньше» представляет лексикографическое сравнение, когда строки сравниваются по их расположению в словаре. Это сравнение не чувствительно к регистру, так что большие и малые буквы не различаются. Сравнение строк означает сравнение кодов их символов, так что лексикографический порядок определяется кодировкой символов алфавита.

· Если эта опция установлена как Binary, то сравнение идет побитно. В этом случае сравнение чувствительно к регистру.

Если нужно локально переопределить вид сравнения, заданный опцией для всего модуля, то можно использовать встроенную функцию StrComp, которая возвращает результат сравнения строк.

Ее синтаксис:

StrComp(string1, string2[, compare])

Аргументы string1 и string2 - сравниваемые строки. Необязательный аргумент compare указывает способ сравнения строк: значение по умолчанию 0 используется, чтобы выполнить двоичное сравнение, 1 задает посимвольное сравнение без учета регистра.

Если string1 меньше чем string2, то результат равен -1, если строки равны, то - 0, если вторая меньше, то - 1, если хоть одна из строк имеет значение Null, то результат также равен Null.

Сравнение с образцом

Полезным средством при работе с текстами является операция Like, задающая сравнение с образцом. Необходимость нахождения в наборе всех строк, удовлетворяющих некоторому шаблону (образцу), возникает в разных задачах. VBA позволяет решать ее в одну операцию. Приведем таблицу специальных символов, допустимых при задании образца.

Таблица 1. Специальные символы, используемые при задании шаблона

Символы Интерпретация Примеры
* Любой текст - произвольное число символов Шаблону Agent* соответствуют все тексты, начинающиеся со слова Agent. Строки Agent007 и Agent Майор Пронин удовлетворяют шаблону.
? Один любой символ Шаблону К?к удовлетворяют, в частности строки Кок и Кук.
# Любая цифра от 0 до 9 Шаблону Agent### соответствуют 1000 различных строк, среди которых и Agent007, но, конечно же, не Agent Майор Пронин.
[множество_символов] Любой символ, принадлежащий множеству Задать множество можно с помощью перечисления и интервалов. Шаблону К[аоу]к удовлетворяют слова "Как", "Кок", "Кук". Чувствительность к регистру зависит от установки опции Option Compare.
[!множество_символов] Любой не принадлежащий множеству символ Шаблону [!а-я] удовлетворяет символ, не являющийся буквой русского алфавита.

Приведем пример работы с операцией Like:

Public Sub LikeOperation()

Const pat1 = "[A-Z]"

Const pat2 = "[a-z]"

Const pat3 = "[!a-z]"

Const pat4 = "[3-5]"

Dim res As Byte

Dim Sym As String

 

res = "Кук" Like "К[аоу]к"

Debug.Print res

 

res = "f" Like pat1

Debug.Print res

res = "f" Like pat2

Debug.Print res

res = "f" Like pat3

Debug.Print res

 

res = "5" Like pat4

Debug.Print res

Sym = "3"

res = Sym Like pat1 & pat4

Debug.Print res

res = Sym Like pat1 Or Sym Like pat4

Debug.Print res

 

End Sub

 

Результаты отладочной печати:

255

 0

 255

 0

 255

 0

 255

В двух последних результатах, демонстрируются некорректный и корректный способы работы с объединением множеств проверяемых символов.

Основные операции над строками

В классической математике давным-давно определен набор основных операций над числовыми и булевыми данными. Строковой арифметикой серьезно стали заниматься с появлением компьютеров. В языках есть операция, называемая конкатенацией строк, обозначаемая, символом "&". Все остальные основные операции реализуются с помощью встроенных функций, имена которых и их аргументы могут варьироваться от языка к языку. Варьируется и сам набор этих операций. Минимально, необходимы две операции: первая - позволяет обнаружить индекс вхождения одной строки в другую, вторая - выделить из строки ее подстроку.

Рассмотрим некоторые операции.

Функция Len(string) возвращает длину строки, заданной аргументом String. Возвращается число символов строки, а не число байтов.

Функция InStr определяет позицию (индекс) первого вхождения одной строки внутри другой строки. Синтаксис:

InStr([start, ]string1, string2[, compare])

Необязательный аргумент start задает позицию, с которой начинается поиск (по умолчанию - с первого символа строки). Аргумент string1 задает строку, в которой выполняется поиск, а string2 - подстроку, вхождение которой ищется. Необязательный аргумент compare имеет тот же смысл, что и для функции StrComp. Возвращаемые значения определяются следующей таблицей.

Таблица 2. Результат работы функции InStr

Условия Значение функции InStr
string1 - пустая строка 0
string1 или string2 равны Null Пустое значение - Null
string2 - пустая строка start
Вхождение string2 не найдено в string1 0
Вхождение string2 найдено в string1 Позиция обнаруженной подстроки
start >Len(string2) 0

Например, два вызова этой функции в окне отладки вернут следующие результаты:

? InStr(4, "XXпXXпXXПXXП", "П", 1)

 6

? InStr(4, "XXпXXпXXПXXП", "П", 0)

 9

Функция Left(string, length) выделяет в строке string указанное число length символов слева, позволяя выделить префикс строки.

Функция Right(string, length) выполняет аналогичную операцию, выделяя символы справа, что позволяет получить суффикс (окончание) строки.

Более универсальная функция Mid(string, start[, length]) позволяет выделить из строки string подстроку длины length, начиная с позиции start.

Вот пример вызова этих функций непосредственно из окна отладки:

? VBA.Left("рококо",3)

рок

? VBA.Right("рококо",3)

око

? VBA.Mid("рококо",3,3)

кок

Функции LTrim(string), RTrim(string), Trim(string) возвращают копию строки, из которой удалены пробелы, находившиеся в начале строки (LTrim), в конце строки (RTrim) или в начале и конце строки (Trim).

Функция String создает строку: содержащую заданное число повторяющихся символов.

Синтаксис:

String(number, character)

Аргумент number задает длину строки, а character - код символа или строковое выражение, первый символ которого используется при создании результирующей строки.

Функции LCase(string) и UCase(string) возвращают копию строки, символы которой приведены к нижнему (Low) или верхнему регистру (Upper).

Функции, возвращающие строки, существуют в двух вариантах, отличающихся именами. Функции, имена которых мы приводили, возвращают результат типа Variant. Во втором варианте имена функций оканчиваются знаком $, например, Mid$, UCase$. В этом случае результат возвращается типа String. Такие функции выполняются быстрее, но не могут корректно работать со строками, имеющими значение Null.

В качестве примера приведем функцию, которая находит путь к активному документу Word, и производит разбор всех компонент этого пути:

Public Function AppPath(Disk As String, Dir As String, FileName As String) As String

'Эта Функция возвращает в качестве результата полный путь активного документа

'Ее параметры содержат компоненты этого пути - имя диска, каталог на диске и имя файла

   Dim MyDoc As Document

   Dim Path As String

   Dim Start As Byte, Finish As Byte

                

   'Определяем полный путь к файлу, задающему активный документ Word

   Set MyDoc = ActiveDocument

   Path = MyDoc.FullName

                

   'Выделяем имя диска - первый символ полного пути

   Disk = VBA.Left(Path, 1)

       

   'Выделяем каталог, в котором хранится документ

   Start = VBA.InStr(1, Path, "\")

   Finish = VBA.InStrRev(Path, "\")

   Dir = VBA.Mid(Path, Start + 1, Finish - Start)

              

   'Выделяем имя файла

   FileName = VBA.Mid(Path, Finish + 1)

                

'Возвращается результат - полный путь к каталогу

   AppPath = VBA.Left(Path, Finish)

End Function

 

Public Sub MyPath()

Dim Path As String

Dim Dir As String

Dim Disk As String

Dim FileName As String

Path = AppPath(Disk, Dir, FileName)

Debug.Print Disk, Dir, FileName, Path

 

End Sub

 

Вот результаты отладочной печати после запуска процедуры MyPath:

E  O2000\VBA2000\Ch8\        Ch8.doc   E:\O2000\VBA2000\Ch8\

В функции AppPath использовали функцию InStrRev, что облегчило решение задачи.


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.073 с.