Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
Динамический метод Split, как обычно, перегружен. Наиболее часто используемая реализация имеет следующий синтаксис:
public string[] Split(params char[])
На вход методу Split передается один или несколько символов, интерпретируемых как разделители. Объект string, вызвавший метод, разделяется на подстроки, ограниченные этими разделителями. Из этих подстрок создается массив, возвращаемый в качестве результата метода. Другая реализация позволяет ограничить число элементов возвращаемого массива.
Синтаксис статического
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 • Преобразование строки в массив символов