Чтение онлайн

ЖАНРЫ

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

Динамический метод Split, как обычно, перегружен. Наиболее часто используемая реализация имеет следующий синтаксис:

public string[] Split(params char[])

На вход методу Split передается один или несколько символов, интерпретируемых как разделители. Объект string, вызвавший метод, разделяется на подстроки, ограниченные этими разделителями. Из этих подстрок создается массив, возвращаемый в качестве результата метода. Другая реализация позволяет ограничить число элементов возвращаемого массива.

Синтаксис статического

метода Join таков:

public static string Join(string delimiters, string[] items)

В качестве результата метод возвращает строку, полученную конкатенацией элементов массива items, между которыми вставляется строка разделителей delimiters. Как правило, строка delimiters состоит из одного символа, который и разделяет в результирующей строке элементы массива items; но в отдельных случаях ограничителем может быть строка из нескольких символов.

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

public void TestSplitAndJoin

{

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

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

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

Console.WriteLine("Разделение текста на простые предложения: ");

string[] SimpleSentences, Words;

//размерность массивов SimpleSentences и Words

//устанавливается автоматически в соответствии с

//размерностью массива, возвращаемого методом

Split SimpleSentences = txt.Split (',');

for (int i=0;i< SimpleSentences.Length; i + +)

Console.WriteLine("SimpleSentences[{0}]= {1}",

i, SimpleSentences[i]);

string txtjoin = string.Join(",",SimpleSentences);

Console.WriteLine("txtj oin={0 } ", txtjоin);

Words = txt.Split (',', ' ');

for (int i=0;i< Words.Length; i ++)

Console.WriteLine("Words[{0}]= {1}",i, Words[i]);

txtjoin = string.Join(" ",Words);

Console.WriteLine("txtjoin={0}", txtjоin);

}//TestSplitAndJoin

Результаты выполнения этой процедуры показаны на рис. 14.3.

Рис. 14.3. Разбор и сборка строки текста

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

• невозможно при сборке восстановить строку в прежнем виде, поскольку не сохраняется информация о том, какой из разделителей был использован при разборе строки. Поэтому при сборке между элементами вставляется один разделитель, возможно, состоящий из нескольких символов;

• при разборе двух подряд идущих разделителей предполагается, что между ними находится пустое слово. Обратите внимание в тексте нашего примера, как и положено, после

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

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

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

Динамические методы класса String

Операции, разрешенные над строками в С#, разнообразны. Методы этого класса позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, частично их переопределяя. Класс String наследует и, следовательно, реализует методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable. Три из них уже рассматривались при описании классов-массивов.

Рассмотрим наиболее характерные методы при работе со строками.

Сводка методов, приведенная в таблице 14.2, дает достаточно полную картину широких возможностей, имеющихся при работе со строками в С#. Следует помнить, что класс String является неизменяемым. Поэтому Replace, Insert и другие методы представляют собой функции, возвращающие новую строку в качестве результата и не изменяющие строку, вызвавшую метод.

Таблица 14.2. Динамические методы и свойства класса String

Метод • Описание

InsertВставляет подстроку в заданную позицию

Remove • Удаляет подстроку в заданной позиции

Replace • Заменяет подстроку в заданной позиции на новую подстроку

Substring • Выделяет подстроку в заданной позиции

IndexOf, IndexOfAny, LastlndexOf, LastlndexOfAny • Определяются индексы первого и последнего вхождения заданной подстроки или любого символа из заданного набора

StartsWith, EndsWith • Возвращается true или false, в зависимости оттого, начинается или заканчивается строка заданной подстрокой

PadLeft, PadRight • Выполняет набивку нужным числом пробелов в начале и в конце строки

Trim, TrimStart, TrimEnd • Обратные операции к методам Pad. Удаляются пробелы в начале и в конце строки, или только с одного ее конца

ToCharArray • Преобразование строки в массив символов

Поделиться с друзьями: