И 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)'Mas (0) = "Иванов" Label2.Text = "Имя – " & Mas(1)'Mas (1) = "Иван" Label3.Text = "Отчество – " & Mas(2)'Mas (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.

И Framework.NET для обработки строк - student2.ru  

Рис. 4.9.4-1. Форма проекта Пример 4.9.4-1Рис. 4.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

И Framework.NET для обработки строк - student2.ru

Рис. 4.9.4-5. Результаты выполнения проекта Пример 9.4-1

4.9.5 Базовые алгоритмы обработки строк
и примеры их программирования

Функции и методы для работы со строками помогли познакомится с возможностями обработки строк и символов в VB. При решении задач следует научиться находить необходимые функции, понимая их предназначение, а также использовать в совокупности простые приемы обработки строк (назовем их базовыми алгоритмами), среди которых можно выделить следующие:

Определение количества символов в строке при заданных условиях (Пример 4.9.5-1).

Замена или вставка символов в строке (Пример 4.9.5-2).

Подсчет количества фрагментов (Пример 4.9.5-3).

Формирование строки из слов при заданных условиях исходной строки (Пример 4.9.5-4).

Данные базовые алгоритмы можно использовать не только для решения учебных задач, но и для разработки текстовых редакторов, программного обеспечения, предназначенного для верстки текста, и т.д.

Пример 4.9.5-1. Разработать процедуру-Function, которая подсчитывает, сколько раз заданный символ встречается в исходной строке.

Программный код приведен на рис. 4.9.5-1.

Function Pr951(ByVal row As String, _ ByVal simvol As String) As Integer Dim kol, i As Integer Dim tmp As String kol = 0 For i = 0 To row.Length - 1 tmp = row.Substring(i,1) If tmp = simvol Then kol = kol + 1 End If Next Return kol End Function Private Sub Button1_Click(…) Dim r As String Dim s As Char s = CChar(InputBox("Введите символ")) : r = TextBox1.Text Label2.Text = "Кол.найденных символов в строке=" & Pr951(r, s) End Sub

Рис. 4.9.5-1 Программный код функции Pr941()

Примера 4.9.5-1

Параметрами функции Pr951() являются строка row и переменная simvol. В цикле происходит выделение символа с помощью метода Substring(). Параметр row – наша исходная строка, i – параметр цикла, который будет изменяться в цикле от нуля (начало строки) до конца строки – за это отвечает метод Length. Cчетчик kol = kol + 1 обеспечивает подсчет количества заданного символа.

Пример 4.9.5-2. Разработать процедуру-Function, которая заменяет пробелы в исходной строке заданным символом.

Параметрами функции Pr952() являются строка row и переменная sim. В методе Replace() используем в качестве параметров исходную строку row, в качестве заменяемой подстроки используем пробел и подстроку, на которую заменяется подстрока – sim. Цель применения операции логического отрицания Not очевидна, т.к. оператор row = row.Replace(" ", sim) будет выполняться тогда, когда логическое выражение будет иметь значение True. Программный код приведен на рис. 4.9.5-2.

Function Pr952(ByVal row As String, ByVal simvol As Char) As String Dim zamena As Boolean If Not zamena Then row = row.Replace(" ", simvol) Else row = row.Replace(simvol, " ") End If zamena = Not zamena Return row End Function Private Sub Button1_Click(…) Dim r As String, s As Char r = TextBox1.Text s = CChar(InputBox("Введите символ")) Label2.Text = "Результирующая строка: " & Pr952(r, s) End Sub

Рис. 4.9.5-2. Программный код процедуры Pr952() Примера 4.9.5-2

Пример 4.9.5-3. Разработать процедуру-Function, которая определяет, сколько раз подстрока row_1 входит в исходную строку row.

Функция Pr953() использует метод IndexOf(), который возвращает позицию подстроки row_1 в исходной строке row, при этом счетчик будет увеличиваться на единицу при каждом нахождении подстроки. В противном случае произойдет досрочный выход из цикла с помощью оператора Exit Do.

Программный код приведен на рис. 4.9.5-3.

Function Pr953(ByVal row As String, ByVal row_1 As String) _ As Integer Dim i, kol, x As Integer i = 0 Do x = row.IndexOf(row_1, i)) If x >= 0 Then i = x + row_1.Length kol = kol + 1 Else Exit Do End If Loop Return kol End Function Private Sub Button1_Click(…) Dim r, r_1 As String r = TextBox1.Text r_1 = InputBox("Введите подстроку") Label2.Text = "Всего вхождений подстроки" & _ r_1 & "в строку " & Pr953(r, r_1) End Sub

Рис. 4.9.5-3. Программный код процедуры Pr953()

Примера 4.9.5-3

Пример 4.9.5-4. Разработать процедуру-Function, которая находит в заданной строке все слова, состоящие только из цифр, и записывает найденные слова в новую строку через пробел. Если таких слов нет, то результатом процедуры должна быть строка с сообщением.

Наши рекомендации