Введение
Каждый язык программирования, даже скриптовые версии Java и VB, поддерживает работу со строками. Конечно, куда же без них. И в Visual Basic есть функции для работы со строками (поиск, замена, соединение, получение длины и др.). О них и о API функциях для работы со строками и пойдёт речь в данной статье.
В Visual Basic строке соответствует тип данных String. Для конвертации переменных другого типа в тип String используется функция CStr. Получить длину строки можно с помощью функции Len.
Константы
В VB существует ряд констант, которые облегчают работу программисту. Ниже приведён их список:
Константа
|
Эквивалент
|
Описание
|
vbBack
|
Chr(8)
|
Символ забоя.
|
vbCr
|
Chr(13)
|
Перевод каретки (символ с Ascii кодом 10).
|
vbCrLf
|
Chr(13) + Chr(10)
|
То же, что и vbCr & vbLf.
|
vbFormFeed
|
Chr(12)
|
Перевод страницы (символ с Ascii кодом 12). Не используется в MS Windows.
|
vbLf
|
Chr(10)
|
Возврат строки (символ с Ascii кодом 10).
|
vbNewLine
|
|
Новая строка
|
vbNullChar
|
Chr(0)
|
Символ с Ascii кодом 0.
|
vbNullString
|
|
Строка с кодом 0. Не совпадает с пустой строкой (“”), используется для вызова внешних процедур.
|
vbTab
|
Chr(9)
|
Символ табуляции (символ с Ascii кодом 9).
|
vbVerticalTab
|
Chr(11)
|
Символ вертикальной табуляции (символ с Ascii кодом 11). Не используется в MS Windows.
|
Соединение строк
Для соединения двух строк можно использовать оператор [+] или оператор конкатенации [&]. Оба оператора работают одинаково и возвратят один и тот же результат, но правильнее для соединения строк использовать оператор конкатенации.
Dim str1 As String
Dim str2 As String
Dim str3 As String
str1 = “VBNet”
str2 = “ - “
str3 = str1 & str2
str1 = str3 & “это крутой сайт”
MsgBox str1
Получение части строки
Для получения части строки используются функции Left, Right, Mid.
Функции Left и Right служат, соответственно, для получения указанного количества символов с левого или с правого края строки. Синтаксис этих функций прост. Они имеют два аргумента:
Аргумент
|
Тип
|
Описание
|
string
|
String
|
Исходная строка.
|
length
|
Long
|
Количество возвращаемых символов.
|
Возвращаемое значение имеет тип String. Возвращается строка, содержащая нужное количество символов с левого или правого края исходной строки. Если аргумент length равен 0, то возвращается пустая строка. Если length больше длины аргумента string, то возвращается вся строка string. Если length меньше нуля, то генерируется ошибка.
Dim str1 As String
Dim str2 As String
str1 = “Раз-два-три”
str2 = Left$ (str1, 3)
MsgBox str2
str2 = Right$ (str1, 3)
MsgBox str2
Функция Mid используется для получения заданного количества символов исходной строки, начиная с заданного символа. Функция имеет 3 аргумента:
Аргумент
|
Тип
|
Описание
|
string
|
String
|
Исходная строка.
|
start
|
Long
|
Позиция, с которой начинается возвращаемая последовательность символов.
|
length
|
Long
|
Необязательный. Количество возвращаемых символов. Значение по умолчанию – 0.
|
В случаях, если аргумент length не указан или равен нулю, или длина аргумента string меньше length, возвращаются все символы аргумента string. Если start больше длины string, то возвращается пустая строка. Если start или length отрицательны, то будет сгенерирована ошибка.
Dim str1 As String
Dim str2 As String
str1 = “раз-два-три”
str2 = Mid$ (str1, 5, 3)
MsgBox str2
Поиск
Для поиска одной строки в другой используется функция InStr. Она возвращает номер символа, с которого начинается искомая строка. Функция имеет 4 параметра:
Аргумент
|
Тип
|
Описание
|
start
|
Long
|
Необязательный. Позиция, с которой начинается поиск. Значение по умолчанию – 1.
|
string1
|
String
|
Исходная строка.
|
string2
|
String
|
Искомая строка.
|
compare
|
Integer
|
Необязательный. Тип сравнения строк. Значение по умолчанию – vbUseCompareOption.
|
Аргумент compare может принимать значение одной из следующих констант:
Константа
|
Значение
|
Описание
|
vbUseCompareOption
|
-1
|
Используется метод сравнения строк, заданный оператором Option Compare в разделе General Declarations модуля. Эта константа является значением по умолчанию.
|
vbBinaryCompare
|
0
|
Используется двоичное сравнение строк. При выполнении операции сравнения символы разного регистра различаются.
|
vbTextCompare
|
1
|
Используется посимвольное сравнение строк. При выполнении операции сравнения символы разного регистра равны.
|
vbDatabaseCompare
|
2
|
Сравнение производится на основе параметров, установленных в базе данных. Только в MS Access.
|
Dim str1 As String
Dim str2 As String
Dim i As Integer
str1 = “тра-ля-пам-фа-ля”
i = InStr (str1, “ля”) ‘Ищем первое “ля”
MsgBox i
str2 = Mid$ (str1, i, 2)
MsgBox str2
i = InStr (i + 3, str1, “ля”)
MsgBox i
str2 = Mid$ (str1, i, 2)
MsgBox str2
Также существует функция InStrRev. Её отличие от функции InStr состоит в том, что InStrRev ищет первое вхождение строки не с начала исходной строки, а с конца. Все параметры те же, что и в InStr, но в другом порядке:
InStrRev (string1, string2, start, compare)
Пример:
Dim str1 As String
Dim str2 As String
Dim i As Integer
str1 = “тра-ля-пам-ля-фа”
i = InStrRev (str1, “ля”)
MsgBox i
str2 = Mid$ (str1, i, 2)
MsgBox str2
Тип символа
Иногда нужно узнать какую-то информацию о символе, например, в каком регистре он находится, является ли символом алфавита, цифрой или знаком препинания и т.д.
Один из возможных вариантов – анализировать Ascii код символа.
Dim str1 As String
Dim i As Integer
str = “w1 .я”
For i = 1 To Len (str)
Select Case Asc (Mid$ (str1, i, 1))
Case 32
MsgBox CStr (i) & “ символ – пробел”
Case 48 To 57
MsgBox CStr (i) & “ символ – цифра”
Case 224 To 255
MsgBox CStr (i) & “ символ – символ русского языка”
Case 97 To 122
MsgBox CStr (i) & “ символ – символ английского языка”
Case 46
MsgBox CStr (i) & “ символ – точка”
End Select
Next
Но этот способ немного неудобен. Также нужно учитывать, какая кодовая страница установлена на компьютере. Существует ряд API функций, способных быстро определить тип символа на основе используемой кодовой страницы. Это такие функции, как IsCharAlpha, IsCharAlphaNumeric, IsCharLower, IsCharUpper.
Функция IsCharAlpha позволяет узнать, является ли символ знаком алфавита. Ниже находится её декларация:
Declare Function IsCharAlpha Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
Declare Function IsCharAlphaNumeric Lib "user32" Alias "IsCharAlphaNumericA" (ByVal cChar As Byte) As Long
Единственный параметр cChar типа Byte – Ascii код тестируемого символа. Функция возвращает ненулевое значение, если символ – знак алфавита и 0 в противном случае.
‘В модуль
Declare Function IsCharAlpha Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
‘В процедуру
Dim str As String
Dim i As Integer
Dim ret As Long
str = “а-б-в. a-b-c.”
For i = 1 To Len (str)
ret = IsCharAlpha (Asc (Mid$ (str, i, 1)))
If ret = 0 Then
MsgBox CStr (i) & “ символ – не знак алфавита!”
Else
MsgBox CStr (i) & “ символ – знак алфавита!”
End If
Next
Функция IsCharAlphaNumeric узнаёт, является ли символ цифрой. Единственный параметр cChar типа Byte – Ascii код тестируемого символа. Функция возвращает ненулевое значение, если символ – цифра и 0 в противном случае. Декларация функции:
Declare Function IsCharAlphaNumeric Lib "user32" Alias "IsCharAlphaNumericA" (ByVal cChar As Byte) As Long
Пример использования:
‘В модуль
Declare Function IsCharAlphaNumeric Lib "user32" Alias "IsCharAlphaNumericA" (ByVal cChar As Byte) As Long
‘В процедуру
Dim str As String’
Dim i As Integer
Dim ret As Long
str = “1a2b3c”
For i = 1 To Len (str)
ret = IsCharAlphaNumeric (Asc (Mid$ (str, i, 1)))
If ret = 0 Then
MsgBox CStr (i) & “ символ – не цифра!”
Else
MsgBox CStr (i) & “ символ – цифра!”
End If
Next
API функции IsCharLower и IsCharUpper используются для определения регистра символа. Они будут рассмотрены ниже в разделе “Регистр”.
Регистр
Для преобразования строки в верхний или нижний регистр существует ряд встроенных и API функций. Среди встроенных функций – функции LCase, UCase и StrConv.
Функции LCase и UCase переводят строку в нижний и верхний регистр соответственно. Функции имеют схожий синтаксис. Единственный параметр string типа String должен содержать исходную строку. Возвращаемое значение имеет тип String.
Dim str1 As String
Dim str2 As String
str1 = “VBNet.Ru”
str2 = LCase (str1) ‘переводим строку в нижний регистр
MsgBox str2
str2 = UCase (str1) ‘переводим строку в верхний регистр
MsgBox str2
Как известно, многие стандартные функции Visual Basic являются всего лишь оболочками для API функций. При этом соответствующие API функции работают гораздо быстрее стандартных функций. Рассмотренным выше функциям LCase и UCase в интерфейсе API соответствуют функции CharLower и CharUpper. Ниже представлены их декларации:
Declare Function CharLower Lib "user32.dll" Alias "CharLowerA" (ByVal lpsz As String) As String
Declare Function CharUpper Lib "user32.dll" Alias "CharUpperA" (ByVal lpsz As String) As String
Эти функции используются так же, как и LCase и UCase.
‘В модуль
Declare Function CharLower Lib "user32.dll" Alias "CharLowerA" (ByVal lpsz As String) As String
Declare Function CharUpper Lib "user32.dll" Alias "CharUpperA" (ByVal lpsz As String) As String
‘В процедуру
Dim str1 As String
Dim str2 As String
str1 = “VBNet.Ru”
str2 = CharUpper (str1) ‘переводим строку в верхний регистр
MsgBox str2
str2 = CharLower (str1) ‘переводим строку в нижний регистр
MsgBox str2
Также преобразовать строку в нужный регистр позволяет функция StrConv. Функция имеет 2 аргумента:
Аргумент
|
Тип
|
Описание
|
string
|
String
|
Исходная строка.
|
conversion
|
Integer
|
Тип конвертации строки.
|
Параметр conversion может принимать значение одной из следующих констант:
Константа
|
Значение
|
Описание
|
vbUpperCase
|
1
|
Преобразует строку к верхнему регистру.
|
vbLowerCase
|
2
|
Преобразует строку к нижнему регистру.
|
vbProperCase
|
3
|
Преобразует первую букву каждого слова в строке к верхнему регистру.
|
vbWide
|
4
|
Преобразует однобайтовые символы в двухбайтовые. Применяется в национальных настройках для стран Дальнего Востока.
|
vbNarrow
|
8
|
Преобразует двухбайтовые символы в однобайтовые. Применяется в национальных настройках для стран Дальнего Востока.
|
vbKatakana
|
16
|
Преобразует символы хираганы в символы катаканы. Только для японского языка.
|
vbHiragana
|
32
|
Преобразует символы катаканы в символы хираганы. Только для японского языка.
|
vbUnicode
|
64
|
Преобразует строку в Unicode с помощью используемой по умолчанию системной кодовой страницы.
|
vbFromUnicode
|
128
|
Преобразует строку из Unicode с помощью используемой по умолчанию системной кодовой страницы.
|
Нас интересуют первые 3 константы.
Dim str1 As String
Dim str2 As String
str1 = “раз-ДВА-три”
str2 = StrConv (str1, vbUpperCase)
MsgBox str2
str2 = StrConv (str1, vbLowerCase)
MsgBox str2
str2 = StrConv (str1, vbProperCase)
MsgBox str2
Существуют 2 функции API IsCharLower и IsCharUpper, которые используются для того, чтобы выяснить, находится символ в верхнем или в нижнем регистре. Ниже приведены их декларации:
Declare Function IsCharLower Lib "user32" Alias "IsCharLowerA" (ByVal cChar As Byte) As Long
Declare Function IsCharUpper Lib "user32" Alias "IsCharUpperA" (ByVal cChar As Byte) As Long
Функции определяют регистр не всей строки, а только одного символа. Синтаксис у этих функций схожий. Единственный параметр cChar типа Byte – Ascii код символа, регистр которого определяется. Возвращаемое значение имеет тип Long. Функция IsCharUpper определяет, находится ли символ в верхнем регистре. Если да, то функция возвратит значение, отличное от нуля. В противном случае – 0. Функция IsCharUpper определяет, находится ли символ в верхнем регистре. Если да, то функция возвратит ненулевое значение, если нет – 0. Пример использования функций:
‘В модуль
Declare Function IsCharLower Lib "user32" Alias "IsCharLowerA" (ByVal cChar As Byte) As Long
Declare Function IsCharUpper Lib "user32" Alias "IsCharUpperA" (ByVal cChar As Byte) As Long
Declare Function IsCharAlpha Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
‘В процедуру
Dim str1 As String
Dim i As Integer
Dim ret As Long
Dim f As Integer
str1 = “A”
ret = IsCharLower (Asc (str1))
If ret = 0 Then
MsgBox “Верхний регистр”
Else
MsgBox “Нижний регистр”
End If
ret = IsCharUpper (Asc (str1))
If ret = 0 Then
MsgBox “Нижний регистр”
Else
MsgBox “Верхний регистр”
End If
‘Если нужно выяснить, в каком регистре находятся несколько символов, то воспользуемся циклом и API функцией IsCharAlpha
str1 = “vbnet.ru”
For i=1 To Len (str1) ‘Перебираем все символы строки
If IsCharAlpha (Asc (Mid$ (str1, i, 1))) <> 0 Then ‘Если символ является знаком алфавита, то
ret = IsCharUpper (Asc (Mid$ (str1, i, 1))) ‘Получаем информацию о регистре
If (ret = 0 And f = 3) Or (ret <> 0 And f = 1) Then f = 2 ElseIf ret = 0 Then f = 1 Else f = 3 ‘Сравниваем с регистром предыдущих символов
End If
If f = 2 Then Exit For ‘Если строка в смешанном регистре, то в цикле делать больше нечего
Next
Select Case f ‘На основе флага f выносим приговор
Case 0
MsgBox “Строка пуста, либо в ней нет символов алфавита!”
Case 1
MsgBox “Все символы строки находятся в нижнем регистре”
Case 2
MsgBox “Строка содержит символы в нижнем и в верхнем регистрах”
Case 3
MsgBox “Все символы строки находятся в верхнем регистре”
End Select
Завершая разговор о регистре, предлагаю вам следующий код для смены регистра строки.
‘В модуль
Declare Function IsCharLower Lib "user32" Alias "IsCharLowerA" (ByVal cChar As Byte) As Long
Declare Function IsCharUpper Lib "user32" Alias "IsCharUpperA" (ByVal cChar As Byte) As Long
Declare Function CharLower Lib "user32.dll" Alias "CharLowerA" (ByVal lpsz As String) As String
Declare Function CharUpper Lib "user32.dll" Alias "CharUpperA" (ByVal lpsz As String) As String
Dim str1 As String
Dim str2 As String
Dim i As Integer
Dim ret As Long
str1 = “VBNet.Ru”
For i = 1 To Len (str1)
ret = IsCharLower (Asc (Mid$ (str1, i, 1)))
If ret = 0 Then
str2 = str2 & CharLower (Mid$ (str1, i, 1))
Else
str2 = str2 & CharUpper (Mid$ (str1, i, 1))
End If
Next
MsgBox str2
Сравнение строк
Часто нужно сравнить две строки. Для этого существует несколько способов.
Первый способ самый лёгкий. Он состоит в использовании оператора сравнения [=].
Dim str1 As String
Dim str2 As String
str1 = “Строка”
str2 = “Строка”
If str1 = str2 Then
MsgBox “Строки идентичны”
Else
MsgBox “Строки не идентичны”
End If
Другой способ – использование стандартной функции StrComp. Она имеет 3 аргумента:
Аргумент
|
Тип
|
Описание
|
string1
|
String
|
Первая сравниваемая строка.
|
string2
|
String
|
Вторая сравниваемая строка.
|
compare
|
Integer
|
Устанавливает тип сравнения строк.
|
Аргумент compare может принимать значения, указанные выше в таблице в разделе Поиск.
Возвращаемое значение функции имеет тип Integer и может принимать следующие значения:
Значение
|
Описание
|
-1
|
Если string1 меньше string2.
|
0
|
Если сравниваемые строки равны.
|
1
|
Если string1 больше string2.
|
Null
|
Если string1 или string2 равен Null.
|
Dim str1 As String
Dim str2 As String
str1 = “Строка”
str2 = “Строка”
Select Case StrComp (str1, str2)
Case -1
MsgBox “str1 меньше str2”
Case 0
MsgBox “str1 равно str2”
Case 1
MsgBox “str1 больше str2”
End Select
Ну и наконец, можно воспользоваться API функцией CompareString. Её декларация:
Declare Function CompareString Lib "kernel32" Alias "CompareStringA" (ByVal Locale As Long, ByVal dwCmpFlags As Long, ByVal lpString1 As String, ByVal cchCount1 As Long, ByVal lpString2 As String, ByVal cchCount2 As Long) As Long
Функция имеет 6 параметров:
Тип
|
Описание
|
|
Long
|
Идентификатор системной локали, используемой для сравнения.
|
|
Long
|
Специальные опции сравнения (игнорирование регистра и др.).
|
|
String
|
Первая сравниваемая строка.
|
|
Long
|
Длина параметра lpString1
|
|
String
|
Вторая сравниваемая строка.
|
|
Long
|
Длина параметра lpString2
|
|
Аргумент dwCmpFlags может принимать следующие значения:
Значение
|
Описание
|
|
&H1
|
Игнорировать регистр.
|
|
|
Игнорировать различия между катаканой и хираганой (только для японского языка).
|
|
&H2
|
Игнорировать любые символы, не принимаемые за пробел.
|
|
&H4
|
Игнорировать символы.
|
|
|
Игнорировать различия между однобайтовыми и двухбайтовыми символами.
|
|
Функция может возвращать одно из следующих значений:
Значение
|
Описание
|
1
|
Если lpString1 меньше string2.
|
2
|
Если сравниваемые строки равны.
|
3
|
Если lpString1 больше string2.
|
Пример использования функции:
‘В модуль
Declare Function CompareString Lib "kernel32" Alias "CompareStringA" (ByVal Locale As Long, ByVal dwCmpFlags As Long, ByVal lpString1 As String, ByVal cchCount1 As Long, ByVal lpString2 As String, ByVal cchCount2 As Long) As Long
‘В процедуру
Dim str1 As String
Dim str2 As String
Dim ret As Long
str1 = “Строка”
str2 = “Строка”
ret = CompareString (1049, 0, Len (str1), str2, Len (str2))
Select Case ret
Case 1
MsgBox “str1 меньше str2”
Case 2
MsgBox “str1 равно str2”
Case 3
MsgBox “str1 больше str2”
End Select
Удаление пробелов
В Visual Basic существует несколько функций для удаления пробелов по краям строки. Это функции Trim, LTrim и RTrim. Функция Trim удаляет пробелы с левого и с правого края строки. LTrim удаляет пробелы только с левого края, а RTrim – только с правого. Синтаксис у этих функций одинаков. Единственный параметр string типа String – исходная строка. Возвращаемое значение также имеет тип String. Функция возвращает строку, из которой были удалены пробелы.
Dim str1 As String
Dim str2 As String
str1 = “ Строка “
str2 = “’” & Trim (str1) & “’”
MsgBox str2
str2 = “’” & LTrim (str1) & “’”
MsgBox str2
str2 = “’” & RTrim (str1) & “’”
MsgBox str2
Замена
Для замены подстроки в строке используется функция Replace. Она впервые появилась в Visual Basic 6. Функция содержит 6 параметров:
Тип
|
Описание
|
|
String
|
Исходная строка.
|
|
String
|
Что заменить.
|
|
String
|
Чем заменить.
|
|
Long
|
Необязательный. Начальная позиция поиска.
|
|
Long
|
Необязательный. Устанавливает количество проводимых замен.
|
|
Long
|
Способ сравнения строк.
|
|
Аргумент compare может принимать значения, указанные выше в таблице в разделе Поиск. Функция возвращает строку, в которой были проведены замены.
Dim str1 As String
Dim str2 As String
str1 = “VBNet.Ru – самый крутой сайт. VBNet.Ru – много информации о VB.”
str2 = Replace$ (str1, “VBNet.Ru”, “msdn.microsoft.com”)
MsgBox str2
Повторение символа
В Visual Basic существует несколько функций для создания строки, содержащей определённый символ определённое количество раз.
Функция Space используется для повторения пробелов. Единственный аргумент number имеет тип Integer и задаёт количество повторений. Возвращаемое значение имеет тип String.
Dim str As String
str = Space$ (50)
Функция String используется для повторения любого символа. Она имеет 2 аргумента:
Тип
|
Описание
|
|
Integer
|
Количество повторений символа.
|
|
Integer
|
Ascii код повторяемого символа.
|
|
Возвращаемое значение функции имеет тип String.
Dim str As String
str = String (10, Asc (“A”))
MsgBox str
Заключение
В этой статье было описано большинство функций VB и API, применяемых для работы со строками.
Многим стандартным функция соответствуют API функции. В завершение статьи небольшой совет: если есть выбор между использованием функции VB и функции API и Вам не безразлично быстродействие Вашего приложения, то лучше воспользуйтесь функцией API.