Поиск ПОДСТРОКИ в строке




При работе со строками зачастую нужно выяснить, не встречается ли заданное слово, фраза или символ в некоторой строке, и если – да, то в каком именно месте. В Visual Basic предусмотрены средства поиска одной строки в другой. С их помощью можно создавать программы для поиска нужных слов в тексте, а также для их последующей замены другими словами.

С помощью функции InStr можно выполнять поиск в строке как отдельного символа, так и целой группы символов. У описываемой функции есть два обязательных и два необязательных параметра. К обязательным параметрам относятся строка, в которой выполняется поиск, и строка, содержащая искомые символы. Если заданная последовательность символов найдена, функция InStr возвращает номер первого совпадающего символа в исходной строке, начиная с единицы. Если последовательность символов не найдена, функция InStr возвращает нулевое значение. В простейшем случае, синтаксис функции InStr выглядит следующим образом:

Function InStr ([ Start as Long, ] S as String, Sub as String [, Compare As VbCompareMethod = vbBinaryCompare ])

Параметр S – исходная строка, Sub – искомая подстрока, Start – номер символа в строке, с которого начинается поиск подстроки. Параметр Start является необязательным, если он не указан, то поиск осуществляется с начала строки. Параметр Compare также является необязательным и определяет способ поиска подстроки. Если он не указан, то равен по умолчанию vbBinaryCompare = 0 и поиск осуществляется с учётом регистра символов. Если параметр Compare равен vbTextCompare = 1, то поиск осуществляется без учёта регистра символов.

Например, в результате выполнения строки кода

Print InStr ("Я встречу вас во вторник", "вас")

будет напечатано число 11, поскольку слово “вас” расположено в исходной строке с 11 позиции от начала.

С помощью первого (необязательного) параметра функции InStr можно указать начальную позицию в исходной строке, с которой нужно начинать поиск. Данный параметр должен быть положительным целым числом. Если начальная позиция больше длины строки, функция InStr () возвращает нулевое значение.

Например, в результате выполнения строки кода

Print InStr (7,"Kто не работает, тот ест", "е")

будет напечатано число 14, несмотря на то, что первая буква “е” встречается в данной фразе на 6-й позиции. Причина состоит в том, что мы заказали поиск символа “е” в строке, начиная с 7-й позиции.

Пример: Формирование списка слов предложения

Dim S As String ‘строка предложения

Dim Word As String ‘слово

Dim Start As Long ‘позиция начала поиска

Dim Pos As Long ‘позиция первого разделителя

Const Char = "U" ‘разделитель

lstWord.Clear ‘очистка списка lstWord

If Len (txt.Text) = 0 Then Exit Sub ‘если нет текста в поле txt, то выходим из процедуры

S = txt.Text & Char ‘добавляем разделитель в конец строки

Start=1 ‘определяем позицию начала поиска

Pos = InStr (S, Char) ‘определяем позицию первого разделителя

Do ‘начало цикла с условием выхода

Word = Mid$ (S, Start, Pos – Start) ‘считываем слово с позиции начала поиска до следующего разделителя

lstWord.AddItem Word ‘добавляем слово в список lstWord

Start = Pos + 1 ‘устанавливаем начало поиска следующего слова с символа после разделителя

Pos = InStr (Start, S, Char) ‘определяем позицию очередного разделителя

Loop Until Pos = 0 ‘выходим из цикла, если разделитель не найден

В приведенном фрагменте программа разбирает строку символов, разделенных пробелами, на отдельные слова и помещает их в список lstWord. Мы считаем словом любую последовательность символов, заканчивающихся пробелом. Поэтому добавили в конец строки пробел. Позиция первого пробела – конец первого слова. Чтобы найти следующие слова, мы изменяем позицию начала поиска. Для этого значение, полученное в результате вызова Функции InStr, мы используем в качестве параметра Start на следующей итерации.

Для выполнения поиска в обратном направлении в Visual Basic предусмотрена еще одна функция, которая называется InStrRev. Принцип ее работы совпадает с функцией InStr, только синтаксис немного отличается:

Function InStr (S as String, Sub as String [, Start as Long [, Compare As VbCompareMethod = vbBinaryCompare ] ])

Основное отличие состоит в tow, что параметр Start, указывающий начальную позицию в исходной строке, с которой будет начат поиск, располагается после самих строк, а не перед ними, как у функции InStr.

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

Пример: Формирование списка слов предложения в обратном порядке

Dim S As String ‘строка предложения

Dim Word As String ‘слово

Dim Start As Long ‘позиция начала поиска

Dim Pos As Long ‘позиция первого разделителя

Const Char = "U" ‘разделитель

lstWord.Clear ‘очистка списка lstWord

If Len (txt.Text) = 0 Then Exit Sub ‘если нет текста в поле txt, то выходим из процедуры

S = txt.Text ‘копирование содержимого текстового поля

Start = Len (txt.Text) ‘определяем позицию начала поиска

Pos = InStr (S, Char) ‘определяем позицию последнего разделителя

Do ‘начало цикла с условием выхода

Word = Mid$ (S, Pos + 1, Start – Pos) ‘считываем слово от позиции разделителя до позиции начала поиска

lstWord.AddItem Word ‘добавляем слово в список lstWord

Start = Pos -1 ‘устанавливаем начало поиска следующего слова с символа после разделителя

Pos = InStrRev (S, Char, Start) ‘определяем позицию очередного разделителя

Loop Until Pos = 0 ‘выходим из цикла, если разделитель не найден

Word = Mid$ (S, 1, Start) ‘выходим из цикла, если разделитель не найден

lstWord.AddItem Word ‘выходим из цикла, если разделитель не найден



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: