Добавить в цитаты Настройки чтения

Страница 297 из 371



• public StringBuilder Insert (int location,<объект>). Метод вставляет Строку, полученную из объекта, в позицию, указанную параметром location. Метод Append является частным случаем метода Insert;

• public StringBuilder Remove (int start, int len). Метод удаляет подстроку длины len, начинающуюся с позиции start;

• public StringBuilder Replace (string str1,string str2). Все вхождения подстроки str1 заменяются на строку str2;

 public StringBuilder AppendFormat (<строка форматов>, <объекты>). Метод является комбинацией метода Format класса String и метода Append. Строка форматов, переданная методу, содержит только спецификации форматов. В соответствии с этими спецификациями находятся и форматируются объекты. Полученные в результате форматирования строки присоединяются в конец исходной строки.

За исключением метода Remove, все рассмотренные методы являются перегруженными. В их описании дана схема вызова метода, а не точный синтаксис перегруженных реализаций. Приведу примеры, чтобы продемонстрировать, как вызываются и как работают эти методы:

//Методы Insert, Append, AppendFormat

StringBuilder strbuild = new StringBuilder ();

string str = "это это не";

strbuild.Append(str); strbuild.Append(true);

strbuild.Insert(4,false); strbuild.Insert(0,"2*2=5 — ");

Console.WriteLine(strbuild);

string txt = "А это пшеница, которая в темном чулане

     хранится," +" в доме, который построил Джек!";

StringBuilder txtbuild = new StringBuilder();

int num =1;

foreach(string sub in txt.Split (', '))

{

     txtbuild.AppendFormat(" {0}: {1} ", num++,sub);

}

str = txtbuild.ToString ();

Console.WriteLine (str);

В этом фрагменте кода конструируются две строки. Первая из них создается из строк и булевых значений true и false. Для конструирования используются методы insert и Append. Вторая строка конструируется в цикле с применением метода AppendFormat. Результатом этого конструирования является строка, в которой простые предложения исходного текста пронумерованы.

Обратите внимание, что сконструированная вторая строка передается в обычную строку класса String. Никаких проблем преобразования строк одного класса в другой класс не возникает, поскольку все объекты, в том числе, объекты класса StringBuilder, обладают по определению методом Tostring.

Обратите внимание, как выглядят результаты работы.

Рис. 14.4. Операции и методы класса StringBuilder

Емкость буфера

Каждый экземпляр строки класса StringBuilder имеет буфер, в котором хранится строка. Объем буфера — его емкость — может меняться в процессе работы со строкой. Объекты класса имеют две характеристики емкости — текущую и максимальную. В процессе работы текущая емкость изменяется, естественно, в пределах максимальной емкости, которая реально достаточно высока. Если размер строки увеличивается, то соответственно автоматически растет и текущая емкость. Если же размер строки уменьшается, то емкость буфера остается на том же уровне. По этой причине иногда разумно уменьшать емкость. Следует помнить, что попытка уменьшить емкость до величины, меньшей длины строки, приведет к ошибке.

У класса StringBuilder имеется 2 свойства и один метод, позволяющие анализировать и управлять емкостными свойствами буфера. Напомню, что этими характеристиками можно управлять также еще на этапе создания объекта, — для этого имеется соответствующий конструктор. Рассмотрим свойства и метод класса, связанные с емкостью буфера:

• свойство Capacity — возвращает или устанавливает текущую емкость буфера;

• свойство MaxCapacity — возвращает максимальную емкость буфера. Результат один и тот же для всех экземпляров класса;

• метод int EnsureCapacity (int capacity) — позволяет уменьшить емкость буфера. Метод пытается вначале установить емкость, заданную параметром capacity; если это значение меньше размера хранимой строки, то емкость устанавливается такой, чтобы гарантировать размещение строки. Это число и возвращается в качестве результата работы метода.

Приведу код, в котором проводятся различные эксперименты с емкостью буфера:

//Емкость буфера

int curvol1 = txtbuild.Capacity;





int curvol2 = strbuild.Capacity;

int maxvol1 = txtbuild.MaxCapacity;

int maxvol2 = strbuild.MaxCapacity;

Console.WriteLine("curvol1= {0}",curvol1);

Console.WriteLine("curvol2= {0}",curvol2);

Console.WriteLine("maxvol1= {0}",maxvol1);

Console.WriteLine("maxvol2= {0}",maxvol2);

int sure1 = txtbuild.EnsureCapacity (100);

int sure2 = strbuild.EnsureCapacity (100);

Console.WriteLine("sure1= {0}",sure1);

Console.WriteLine("sure2= {0}",sure2);

curvol2 = strbuild.Capacity;

Console.WriteLine("curvol2= {0}",curvol2);

//ошибка! попытка установить емкость меньше длины строки

//strbuild.Capacity = 25;

strbuild.Capacity = 256; //так можно!

curvol2 = strbuild.Capacity;

Console.WriteLine("curvol2= {0}",curvol2);

//увеличим строку — емкость увеличится

int len = txtbuild.Length;

txtbuild.Append(txtbuild.ToString ());

curvol1 = txtbuild.Capacity;

Console.WriteLine("curvol1= {0}",curvoll);

//уменьшим строку txtbuild.Remove(len, len);

curvol1 = txtbuild.Capacity;

Console.WriteLine("curvol1= {0}",curvol1);

В этом фрагменте кода анализируются и изменятся емкостные свойства буфера двух объектов. Демонстрируется, как меняется емкость при увеличении и уменьшении размера строки. Результаты работы этого фрагмента кода показаны на рис. 14.5.

Рис. 14.5. Анализ емкостных свойств буфера

15. Регулярные выражения

Регулярные выражения. Пространство RegularExpressions и его классы. Регулярные выражения и языки. Теория регулярных выражений. Практика применения регулярных выражений. Разбор текстов и поиск по образцу. Свойства и методы класса Regex и других классов, связанных с регулярными выражениями. Примеры применения регулярных выражений.

Пространство имен RegularExpression и классы регулярных выражений

Стандартный класс String позволяет выполнять над строками различные операции, в том числе поиск, замену, вставку и удаление подстрок. Существуют специальные операции, такие как Join, Split, которые облегчают разбор строки на элементы. Тем не менее, есть классы задач по обработке символьной информации, где стандартных возможностей явно не хватает. Чтобы облегчить решение подобных задач, в Net Framework встроен более мощный аппарат работы со строками, основанный на регулярных выражениях. Специальное пространство имен RegularExpression, содержит набор классов, обеспечивающих работу с регулярными выражениями. Все классы этого пространства доступны для C# и всех языков, использующих каркас Net Framework. В основе регулярных выражений лежит хорошая теория и хорошая практика их применения. Полное описание, как теоретических основ, так и практических особенностей применения этого аппарата в С#, требует отдельной книги. Придется ограничиться введением в эту интересную область работы со строками, не рассматривая подробно все классы, входящие в пространство имен RegularExpression.