Поиск подстроки в строке

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

Алгоритм Кнута — Морриса — Пратта для нахождения подстроки в строке


Интересные записи:

Понравилась статья? Поделиться с друзьями: