
ВыбОрКа части строки
Задача выборки части текста из исходной строки возникает довольно часто, например, для выделения фамилии из полного имени клиента или для разделения введенной пользователем информации на части для помещения их в соответствующей записи базы данных. Такого типа задачи решаются в Visual. Basic очень просто, благодаря наличию функций Left, Right, Mid, синтаксис которых, выглядит следующим образом:
Function Left$ ( S As String , Length As Long ) As String
Function Right$ ( S As String , Length As Long ) As String
Функция Left возвращает Length символов с начала строки, функция Right – с конца строки. При вызове данных функций значение параметра Length должно быть больше нуля. Если оно равно нулю, возвращается строка нулевой длины. Если значение описываемого параметра больше длины исходной строки, возвращается вся исходная строка целиком.
Для выделения символов из произвольной части исходной строки используется функция Mid. Принцип ее применения практически такой же, как и функций Left и Right, но за одним исключением. У функции Mid предусмотрен еще один дополнительный параметр, с помощью которого вы можете выделить одну букву, слово или целое предложение из любой части исходной строки.
Function Mid$ ( S As String , Start As Long [ , Length As Long ] ) As String
Функция Mid возвращает Length символов, начиная с символа под номером Start. Если значение параметра Start превосходит длину строки, возвращается строка нулевой длины. С помощью дополнительного параметра Length указывается количество символов, которые нужно извлечь из исходной строки. Если данный параметр опущен, возвращается часть строки, начиная с указанной позиции и до конца строки, например:
Print Mid ( "Александр Пушкин" , 11 ) ' Возвращается "Пушкин"
Print Mid ( "Александр Пушкин" , 11 , 2 ) ' Возвращается "Пу"
Поиск подстроки в строке
При работе со строками зачастую нужно выяснить, не встречается ли заданное слово, фраза или символ в некоторой строке, и если – да, то в каком именно месте. В 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 ‘выходим из цикла, если разделитель не найден