При работе со строками зачастую нужно выяснить, не встречается ли заданное слово, фраза или символ в некоторой строке, и если – да, то в каком именно месте. В 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 ‘выходим из цикла, если разделитель не найден