Лабораторная работа №6. Работа со строками

Строки в С#

Класс Char. Использует двухбайтную кодировку символов Unicode. Константу можно задавать:

• символом, заключенным в одинарные кавычки;

• escape-последовательностью, задающей код символа;

• Unicode-последовательностью.

char ch1='A', ch2 ='\x5A', ch3='\u0058'; char ch = new Char(); int code; string s; ch = ch1;

//преобразование символьного типа в тип int code = ch; ch1=(char) (code +1); //преобразование символьного типа в строку s = ch1.ToString()+ch2.ToString()+ch3.ToString();


Класс Char имеет большое число методов (см. табл.6.1).

Класс Char[] - массив символов. Можно использовать для пред­ставления строк постоянной длины. Массив char[] - это обычный мас­сив. Он не задает строку, заканчивающуюся нулем. В C# не определе­ны взаимные преобразования между классами String и Char[]. Для этого можно применить метод ToCharArray() класса String или посим­вольно передать содержимое переменной string в массив символов:

Программа 1. Массивы символов Char[] string CharArrayToString(char[] ar) { string result-'";

for(int i = 0; i< ar.Length; result += ar[i]; return(result);

}

void PrintCharAr(string name,char[] ar) { Console.WriteLine(name);

for(int i=0; i < ar.Length; Console.Write(ar[i]); Console.WriteLine();

}

public void TestCharArAndString() { string hello = "Здравствуй, Мир!"; char[] strMl = hello.ToCharArray(); PrintCharAr("strM1",strM 1); char[] World = new char[3];

Array.Copy(strM1,12,World,0,3); //копирование подстроки PrintCharAr("World",World); Console.WriteLine(CharArrayToString(World)); }

Класс Char[] является наследником классов Object и класса Array и обладает всеми методами родительских классов.

Класс String. Яляется основным типом при работе со строками. За­дает строки переменной длины. Над объектами этого класса определен широкий набор операций, соответствующий современному представ­лению о том, как должен быть устроен строковый тип. Объекты класса String объявляются как все прочие объекты простых типов - с явной или отложенной инициализацией, с явным или неявным вызовом кон­структора класса. Чаще всего при объявлении конструктор явно не вы­зывается, а инициализация задается строковой константой. Но у класса Sring достаточно много конструкторов. Они позволяют сконструиро­вать строку:

• из символа, повторенного заданное число раз;

• массива символов char[]; части массива символов.

string world = "Мир"; string sssss = new string('s',5); char[] yes = "Yes".ToCharArray(); string stryes = new string(yes); string strye = new string(yes,0,2);

Console.WriteLine("world = {0}; sssss={1}; stryes={2};"+ " strye= {3}", world, sssss, stryes, strye);

Над строками определены следующие операции:

• присваивание (=);

• две операции проверки эквивалентности (= =) и (!=);

• конкатенация или сцепление строк (+); взятие индекса ([]).

В результате присваивания создается ссылка на константную строку, хранимую в "куче". Операции, проверяющие эквивалент­ность, сравнивают значения строк, а не ссылки. Бинарная опера­ция "+" сцепляет две строки, приписывая вторую строку к хвосту первой. Взятие индекса при работе со строками отражает тот факт, что строку можно рассматривать как массив и получать каждый ее символ. Символ строки имеет тип char, доступный только для чтения, но не для записи.

Класс String относится к неизменяемым классам (immutable). Ни один из его методов не меняет значения существующих объектов. Ме­тоды создают новые значения и возвращают в качестве результата но­вые строки. Методы класса String описаны в табл. 6.2 и 6.3.


Т аб ли ца 6.2

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

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


Строковые константы. В C# существуют два вида строковых констант:

обычные константы, которые представляют строку символов, за­ключенную в кавычки;

• @-константы, заданные обычной константой c предшествую­щим знаком @.

В обычных константах некоторые символы интерпретируются осо­бым образом. Например, управляющие символы, начинающиеся сим­волом "\". В @-константах все символы трактуются в полном соответ­ствии с их изображением. Пример задания констант: s1 = "c:\\c#book\\ch5\\chapter5.doc"; s2 = @"c:\c#book\ch5\chapter5.doc".

Класс StringBuilder - построитель строк. Компенсирует недос­таток класса String. Класс принадлежит к изменяемым классам и нахо­дится в пространстве имен System.Text. Объекты класса объявляются с явным вызовом конструктора класса. Конструктор без параметров соз­дает пустую строку.

public StringBuilder (string str, int cap). Параметр str задает строку инициализации, cap - емкость объекта;

public StringBuilder (int curcap, int maxcap). Параметры curcap и maxcap задают начальную и максимальную емкость объекта;

public StringBuilder (string str, int start, int len, int cap). Параметры str, start, len задают строку инициализации, cap - емкость объекта. Над строками класса определены операции:

- присваивание (=);

- две операции проверки эквивалентности (= =) и (!=);

- взятие индекса ([]).

Операция конкатенации (+) не определена, ее роль играет метод Append.

Со строкой этого класса можно работать как с массивом, допуска­ется не только чтение отдельного символа, но и его изменение.

Программа 2. Строки класса StringBuilder public void TestStringBuilder(){ StringBuilder s1 =new StringBuilder("ABC"), s2 =new StringBuilder("CDE"), s3 = new StringBuilder(); s3= s1.Append(s2); bool b1 = (s1==s3); char ch1 = s1[0], ch2=s2[0];

Console.WriteLine("s1={0}, s2={1}, b1={2}," + "ch1={3},

ch2={4}", s1,s2,b1,ch1,ch2);

StringBuilder s = new StringBuilder("Zenon");

s[0]='L'; Console.WriteLine(s);

}

Основные методы класса:

public StringBuilder Append (<объект>). К строке, вызвавшей ме­тод, присоединяется строка, полученная в качестве параметра. Метод перегружен и может принимать на входе объекты всех простых ти­пов. В качестве результата возвращается ссылка на объект, вызвав­ший метод.

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

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

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

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

За исключением метода Remove, все рассмотренные методы явля­ются перегруженными.

Пространство имен RegularExpression

Регулярные выражения - это один из способов поиска подстрок (соответствий) в строках. Осуществляется с помощью просмотра стро­ки в поисках некоторого шаблона (табл. 6.4). Очень эффективны биб­лиотеки, интерпретирующие регулярные выражения, обычно пишутся на низкоуровневых высокопроизводительных языках (С, C++, Assembler). С помощью регулярных выражений выполняются три дей­ствия:

• проверка наличия соответствующей шаблону подстроки;

• поиск и выдача пользователю соответствующих шаблону под­строк;

• замена соответствующих шаблону подстрок.

Синтаксис регулярных выражений. Регулярное выражение на C# задается строковой константой. Обычно используется @-конс-танта. В С# работа с регулярными выражениями выглядит сле­дующим образом:

Regex re = new Regex(«образец», «опции»);

MatchCollection me = ге.1УМсг^("строка для поиска");

iCountMatchs = me.Count,

где re - это объект типа Regex. В конструкторе ему передается образец поиска и опции.


Класс Regex. Это основной класс, объекты которого определяют регулярные выражения. В конструктор класса передается в качестве параметра строка, задающая регулярное выражение. Основные методы класса Regex:

метод Match запускает поиск первого соответствия. Параметром передается строка поиска. Метод возвращает объект класса Match, описывающий результат поиска.

Программа 3. Поиск первого соответствия шаблону string FindMatch(string str, string strpat){ Regex pat = new Regex(strpat); Match match =pat.Match(str); string found = ""; if (match.Success) {

found =match. Value;

Console.WriteLine("Строка ={0}\Юбразец={1}^ Найдено={2}", str,strpat,found);

}

return(found);

}

public void TestSinglePat(){ string str, strpat, found; Console.WriteLine("Поиск по образцу"); //образец задает подстроку, начинающуюся с символа a, //далее идут буквы или цифры. str ="start"; strpat =@"a\w+"; found = FindMatch(str,strpat); //art str ="fab77cd efg";

found = FindMatch(str,strpat); //ab77cd //образец задает подстроку, начинающуюся с символа a, //заканчивающуюся f с возможными символами b и d в середине

strpat = "a(b|d)*f'; str = "fabadddbdf';

found = FindMatch(str,strpat); //adddbdf

}

метод Matches позволяет разыскать все непересекающиеся вхо­ждения подстрок, удовлетворяющие образцу. В качестве результата возвращается объект MatchCollection, представляющий коллекцию объектов Match.

Программа 4. Поиск всех соответствий шаблону void FindMatches(string str, string strpat) { Regex pat = new Regex(strpat); MatchCollection match =pat.Matches(str); Console.WriteLine(" Строка ={0}\Юбразец={1}^ Найдено={2}", str,strpat,match.Count);

}

Console.WriteLine("око и рококо"); strpat="око"; str = "рококо";

FindMatches(str, strpat); //найдено одно соответствие

• метод NextMatch запускает новый поиск.

метод Split является обобщением метода Split класса String. Он позволяет, используя образец, разделить искомую строку на элементы.

static void Main() {

string si = "Один, Два, Три, Строка для разбора";

Regex theRegex = new Regex(" |, |,");

int id = 1;

foreach (string substring in theRegex.Split(si))

Console.WriteLine("{0}: {1}", id++, substring);

}

• метод Replace - позволяет делать замену найденного образца. Метод перегружен. При вызове метода передаются две строки: первая задает строку, в которой необходимо произвести замену, а вторая - на что нужно заменить найденную подстроку.

Regex r = new Regex(@"(a+)"); string s="bacghghaaab";

s=r.Replace(s,"_$1_"); // $1 - соответствует группе (а+)

Console.WriteLine("{0}",s);

Третий параметр указывает, сколько замен нужно произвести:

Regex r = new Regex(@"(dotsite)"); string s="dotsitedotsitedotsiterulez"; s=r.Replace(s,"f",1); Console.WriteLine("{0}",s);

Четвертый параметр указывает, с какого вхождения производить замены:

Regex r = new Regex(@"(dotsite)"); string s="dotsitedotsitedotsiterulez"; s=r.Replace(s,"f',2,1); Console.WriteLine("{0}",s);

Классы Match и MatchCollection. Коллекция MatchCollection, по­зволяет получить доступ к каждому ее элементу - объекту Match. Для этого можно использовать цикл foreach.

При работе с объектами класса Match наибольший интерес пред­ставляют свойства класса. Рассмотрим основные свойства:

• свойства Index, Length и Value наследованы от прародителя Capture. Они описывают найденную подстроку - индекс начала под­строки в искомой строке, длину подстроки и ее значение;

• свойство Groups класса Match возвращает коллекцию групп -объект GroupCollection, который позволяет работать с группами, соз­данными в процессе поиска соответствия;

свойство Captures, наследованное от объекта Group, возвращает коллекцию CaptureCollection.

Программа 5. Поиск всех образцов, соответствующих регулярно­му выражению

public static void Main() {

string si = "Это строка для поиска";

// найти любой пробельный символ следующий за непробельным

Regex theReg = new Regex(@"(\S+)\s");

// получить коллекцию результата поиска

MatchCollection theMatches = theReg.Matches (si);

// перебор всей коллекции

foreach (Match theMatch in theMatches) {

Console.WriteLine("theMatch.Length: {0}",

theMatch.Length);

if (theMatch.Length!= 0)

Console.WriteLine("theMatch: {0}", theMatch.ToString());

} }

Классы Group и GroupCollection. Коллекция GroupCollection воз­вращается при вызове свойства Group объекта Match. Имея эту кол­лекцию, можно добраться до каждого объекта Group.

Свойства создаваемых групп:

при обнаружении одной подстроки, удовлетворяющей условию поиска, создается не одна группа, а коллекция групп;

• группа с индексом 0 содержит информацию о найденном соот­ветствии;

• число групп в коллекции зависит от числа круглых скобок в за­писи регулярного выражения. Каждая пара круглых скобок создает дополнительную группу;

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

Создание именованных групп крайне полезно при разборе строк, содержащих разнородную информацию. Например:

Программа 6. Создание именованных групп public static void Main() {

string stringl = "04:03:27 127.0.0.0 GotDotNet.ru";

Regex theReg = new Regex(@"(?<время>(М|\:)+)^" + @"(?<ip>(\d|\.)+)\s" + @"(?<url>\S+)");

// группа time - одна и более цифр или двоеточий, за которыми сле­дует пробельный символ

// группа ip адрес - одна и более цифр или точек, за которыми сле­дует пробельный символ

// группа url - один и более непробельных символов MatchCollection theMatches = theReg.Matches (stringl); foreach (Match theMatch in theMatches) {

if (theMatch.Length!= 0) {

// выводим найденную подстроку

Console.WriteLine("\ntheMatch: {0}", theMatch.ToString ()); // выводим группу "time"

Console.WriteLine ("время: {0}", theMatch.Groups["время"]); // выводим группу "ip"

Console.WriteLine("ip: {0}", theMatch.Groups["ip"]); // выводим группу "url"

Console.WriteLine("url: {0}", theMatch.Groups["url"]);

}}}

Задания к лабораторной работе 6:

1. Изучить предлагаемую теорию.

2. Записать и откомпилировать программы 1 -6, использующие графический интерфейс, ввод, вывод строк с возможностью поиска требуемого сочетания символов.

3. Выполнить домашние задания (тема 5), согласно номеру варианта.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: