Строки в С#
Класс 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), согласно номеру варианта.