Visual Basic, .NET, ASP, VBScript
 

   
 

.NET разработчик, автор множества статей. В ранние годы (2001 - 2003) занимался разработкой на Visual Basic 6 и Active Server Pages, с 2003 года в основном занят разработкой корпоративного программного обеспечения на платформе Microsoft .NET (C#, VB.NET; ASP.NET, Silverlight). Личный блог: http://pavel.surmenok.com/

 
     
   
 

Введение

    Каждый язык программирования, даже скриптовые версии 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.

Павел Сурменок
pavel@vbnet.ru
vbnet.ru
 
     

   
   
     
  VBNet рекомендует