Средства Visual Basic и Framework.NET для обработки строк
Средства языка VB для работы со строками. В VBсуществует операция для работы со строками – конкатенация (объединение строк). Она позволяет объединить несколько строк в одну:
ТекстоваяПеременная = Строка1 & Строка2 & … |
Строка1, Строка2… – это строковые выражения, состоящие из строковых переменных, строковых констант, строковых литералов и свойств объектов Text.
Например:
Label1.Text = "Cтудент " & TextBox1.Text & " сдал " & _ СданоЛабораторок(ИндексСтудента) & " лабораторных работ" |
При сравнении двух строк, которые содержат больше одного символа, VB начинает сравнивать первый символ первой строки с первым символом второй строки, а затем продолжает посимвольное сравнение этих строк до тех пор, пока не найдет различие.
Например, строки Mike и Michael одинаковы до третьего символа ("k" и "с"). Так как значение ASCII "k" больше, чем значение "с", выражение
"Mike" > "Michael" истинно.
Если между строками не найдено различий, то они равны. Если две строки равны на протяжении нескольких символов, но одна строка продолжается, а вторая заканчивается, то более длинная строка больше, чем более короткая. Например, выражение "ААААА" > "ААА" истинно.
Средства работы со строками библиотек Framework.NET класса String.Как известно,VB является полностью объектно-ориентированным языком, который использует библиотеки классов .NET Framework. Это в частности сказывается в том, что строки являются не базовыми типами, подобными числовым типам, а объектами класса String. Этот класс является общим для всех языков платформы .NET Framework. Обращение к строкам производится по тем же правилам, что и к свойствам и методам элементов управления. Например, TextBox1.Text возвращает свойство Text объекта TextBox1, а метод ListBox1.Items.Add("Февраль") добавляет строку "Февраль" в список ListBox1.
Обращение к свойствам и методам объекта производится по правилу точечной нотации:
ИмяОбъекта.ИмяСвойства ИмяОбъекта.ИмяМетода(СписокФактическихПараметров ) |
К наиболее частым действиям со строками, кроме конкатенации, можно отнести следующие действия:
· выделение части строки;
· поиск в строке по образцу;
· замена по образцу;
· изменение регистра символов (большие – маленькие буквы);
· удаление лишних пробелов;
· добавление выравнивающих полей.
Для выполнения вышеперечисленных действий в библиотеки .NET Framework существует большое число методов. Рассмотрим некоторые из них более подробно.
Выделение части строки. Метод Substring() возвращает часть строки заданной длины, начиная с указанной позиции в строке.
ИмяОбъекта.Substring(ИндексСтартСимСтроке, КолСимволов) |
В примере выделяется один символ строки, начиная с пятого:
Dim S As String = "Крокодил" Dim ПятыйСимволСтроки As String = S.Substring(4,1) 'ПятыйСимволСтроки="о" |
Если количество возвращаемых символов не указано, возвращается часть строки от стартового символа до конца строки.
Для выделения последних символов строки необходимо знать размер строки, который возвращает свойство Length.
Dim S As String = "Крокодил" Dim L As Integer = S.Length'L=8 |
Существует также метод Right( ), возвращающий последние символы. Для использования этого метода размер строки знать не нужно:
Dim ПослДвеБук As String = Strings.Right(S,2)'ПослДвеБук = "ил" |
Необходимо обратить внимание на синтаксис обращения к этому методу. Здесь строковый объект не указывается перед точкой, а является параметром обращения к методу; это – так называемый статический метод класса.
Поиск в строке. Часто нужно искать в строке положение разделителя слов, например, пробела между именем и отчеством. Для поиска заданного символа используется метод IndexOf( ). Этот метод возвращает индекс первого вхождения символа в строку:
Dim ФИО As String = "Сидоров Иван Петрович" Dim ПервыйПробел As Integer = ФИО.IndexOf(" ")'ПервыйПробел=7 Dim P As Integer = ФИО.IndexOf("о")'P=3 |
Если нужно найти последнее вхождение символа в строке, используется метод LastIndexOf().
Dim ПосПроб As Integer = ФИО.LastIndexOf(" ")'ПосПроб=12 P = ФИО.LastIndexOf("о")'P=17 |
А что делать, если пробелов или искомых подстрок в строке несколько и требуется разобрать текст по словам? В этом случае используется более общая модификация метода IndexOf().
Строка.IndexOf(Символ, СтартовыйИндексПоиска) |
Например:
СледИнПро=ФИО.IndexOf(" ", ПредыдущийИндексПробела) P = ФИО.IndexOf("о",4)'P=5 P = ФИО.IndexOf("б",4)'P=-1 символ "б" не найден |
Если символ не найден, возвращается значение -1.
Методы, имеющие несколько вариантов списков параметров обращения, называются перегруженными методами (п.3.5).
Для полного разбора строки на слова существует метод, превращающий строку в массив слов или других подстрок, разделённых запятыми или какими-то другими разделителями. Синтаксис обращения, следующий:
Строка.Split(СимволРазделитель) |
Метод Split() применяется для разбивки исходной строки на подстроки и сохраняет эти подстроки в массиве. Метод Split() разделяет строку по границам, определяемым одиночными символами.
Ниже приведен пример разбора на отдельные слова строки, состоящей из нескольких слов:
Dim ФИО As String = "Иванов Иван Иванович" Dim Mas ( ) As String = ФИО.Split(" ") Label1.Text = "Фамилия – " & Mas(0)'Massiv(0) = "Иванов" Label2.Text = "Имя – " & Mas(1)'Massiv(1) = "Иван" Label3.Text = "Отчество – " & Mas(2)'Massiv(2) = "Иванович" |
Существует обратный метод Join(), который возвращают строку, получаемую объединением нескольких строк, содержащихся в указанном массиве.
String.Join(СимволРазделитель, ОдномерныйМассив) ' для метода |
Метод в качестве символа разделителя может использовать как одиночный символ, так и строку. Если в качестве разделителя задана строка нулевой длины, то все подстроки массива объединяются в одну строку без разделения.
Кроме того, существуют методы, проверяющие окончание строки – EndsWith( ) и начало строки – StartsWith( ):
If TextBox1.Text.EndsWith("ич") Then Обращение = "Дорогой " ElseIf TextBox1.Text.EndsWith("на") Обращение = "Дорогая " Else Обращение = "Товарищ " End If |
Замена символов. Для замены символов используется метод
Replace()c указанием заменяемых и заменяющих символов:
Строка.Replace(ИсходнаяПодстрока, НоваяПодстрока) |
Этот метод возвращает новую подстроку, созданную на основе исходной строки путём указанной замены. Например,
Dim Был As String = "Дорогой " Dim Станет As String = Был.Replace("ой", "ая" ) |
Если возвращаемое значение присваивается исходной строке, всё равно образуется новая строка, а старая с этим именем становится недоступной и автоматически удаляется «службой уборки мусора», встроенной в .NET Framework.
Удаление символов. Для удаления символов используется метод
Remove(). Он удаляет заданное количество символов, начиная с заданного.
Строка.Remove(НачальнаяПозиция, КоличествоУдаляемыхСимволов) |
Dim Оценка As String = "неудовл." Оценка = Оценка.Remove(0,2) |
Изменение регистра символов. Используемые для этого методы возвращают копию строки, преобразованную к указанному регистру. Метод ToUpper()создаёт строку, преобразованную к верхнему регистру, метод ToLower() – к нижнему регистру. Параметров эти методы не требуют.
Dim ВсёБолБуквами As String = ИсходнаяСтрока.ToUpper() Dim ВсёМалБуквами As String = ИсходнаяСтрока.ToLower() |
Удаление лишних пробелов. Пробелы в начале или конце строки могут появляться из-за привычки части пользователей нажимать на <Space> где надо и не надо. Лишние пробелы влияют на результат операции сравнения. Метод TrimStart() удаляет пробелы в начале строки, перед первым не пробельным символом, TrimEnd() удаляет пробелы в конце строки, а Trim() удаляет пробелы и в конце, и в начале строки.
Средства работы со строками библиотек Framework.NET класса StringBuilder. Любой объект класса String является неизменяемым, и его значение никогда не изменяется после создания строки. Это означает, что при каждом применении метода, который изменяет значение строки, в действительности создается новый объект типа String. Например, выражение:
S = S.Insert(3, "1234")не изменяет исходную строку в памяти. Вместо этого метод Insert() создает новый объект типа String, который затем присваивается объектной переменной S. Исходный строковый объект в памяти, в конце концов, будет уничтожен вовремя следующей сборки мусора, если только на него не указывает другая переменная. Схема выделения памяти .NET обеспечивает, что этот механизм добавляет относительно небольшие непроизводительные издержки, тем не менее, слишком большое количество операций выделения и освобождения памяти можетухудшить эффективность приложения. Объект типа Text.StringBuilder предлагает решение этой проблемы. Причем при использовании объектов класса StringBuilder необходимо подключить библиотеку System.Text (Imports System.Text).
Объект типа System.Text.StringBuilder можно представить в виде буфера, который содержит строку, способную увеличиваться в размерах от нуля символов и до текущей вместимости этого буфера. До тех пор, пока эта вместимость не превышена, строка строится в буфере, и память не выделяется и не освобождается. Если строка становится больше текущей вместимости буфера, объект класса StringBuilder создает буфер большего размера. Используемый по умолчанию буфер изначально содержит 16 символов, но это значение можно изменить, присвоив другое значение вместимости в конструкторе StringBuilder() или присвоив новое значение свойству Capacity.
'Создание объекта StringBuilder 'с начальной вместимостью 1000 символов Dim sb As New StringBuilder(1000) |
Строку, хранящуюся в объекте StringBuilder, можно обрабатывать с помощью нескольких методов, большая часть которых имеет такое же имя и работает так же, как методы, определенные в классе String. Например, методы Insert(), Remove()и Replace(). Чаще всего строку внутри объекта
StringBuilder строят с помощью метода этого объекта Append(), который принимает аргумент любого типа и добавляет его к текущей внутренней строке:
'Создание списка первых 100 целых чисел, разделенных запятыми For n As Integer = 1 То 100 'Обратите внимание на то, что два метода Append исполняются быстрее, 'чем один метод Append, аргумент которого–конкатенация n истроки "," sb.Append(n) : sb.Append(",") Next n sb.Insert(0, "Список чисел:")'Вставляет строку в начало буфера TextBox1.Text = sb.ToString()' Список чисел: 1,2,3,4,5,6,... TextBox2.Text = CStr(sb.Length)' Длина строки равна 309 |
Свойство Length возвращает текущую длину внутренней строки.
Также имеется метод AppendFormat(), который позволяет задать строку форматирования во многом так же, как и метод String.Format(), и метод
AppendLine(), который добавляет в буфер обмена StringBuilder строку и используемый по умолчанию символ конца строки:
For n As Integer = 1 То 100 sb.AppendLine(CStr(n)) Next n |
В результате этого фрагмента программы получится объект-строка из чисел, причем каждое число будет записываться с новой строки. Так как технически содержимое объекта StringBuilder является не строкой, а символьным буфером, то в нужный момент (например, для вывода результата или присвоения) этот объект необходимо преобразовать в строку методом ToString().
Пример 4.9.4-1. Создать проект, который вводит с клавиатуры строки a и b, отображает их на форме, а затем обрабатывает, удаляя из строки a все символы, входящие в строку b и расположенные на нечетных позициях строки b, результат обработки необходимо отобразить на форме.
Форма интерфейса пользователя приведена на рис. 4.9.4-1.
Схема алгоритма обработки представлена на рис. 4.9-4-2.
|
Рис. 9-4-1. Форма проекта Пример 9.4-1 Рис. 9-4-2. Схем алгоритма
процедуры Обработка()
Примера 4.9.4-1
Программный код проекта представлен на рис. 4.9.4-3. Он содержит процедуры vvod(), vivod()и Обработка().
Public Class Form1 'Процедура вывода результата в TextBox Sub vivod(ByVal z As String, ByRef t As TextBox) If z.Length <> 0 Then t.Text = z Else t.Text = "Все удалено" End If End Sub 'Функция ввода исходных данных из TextBox Function vvod(ByVal T As TextBox) As String Return T.Text End Function Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim Str1, Str2 As String Str1 = vvod(TextBox1) : Str2 = vvod(TextBox2) Обработка(Str2, Str1) : vivod(Str1, TextBox3) End Sub Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click End End Sub 'Процедура решения задачи удаления символов из строки Sub Обработка(ByVal b As String, ByRef a As String) Dim d, m, i, j As Short m = CShort(a.Length)'длина строки a d = CShort(b.Length)'длина строки b For i = 0 To CShort(d - 1) Step 2 'перебор нечетных симв. строки b j = 0 Do While j < m'перебор всех символов строки a If a.Substring(j, 1) = b.Substring(i, 1) Then a = a.Remove(j, 1)'пока симв.совпад. удаляем из a m = CShort(m - 1)'уменьшаем длину строки a Else j = CShort(j + 1)'переход к след.символу строки a End If Loop Next i End Sub End Class |
Рис. 4.9.4-3. Программный код проекта Пример 9.4-1
Рис. 4.9.4-5. Результаты выполнения проекта Пример 9.4-1