Слайд 1Символы и строки
символы char,
неизменяемые строки string,
изменяемые строки StringBuider,
регулярные выражения Regex
Слайд 2Символы char
Символьный тип char предназначен для хранения символа в кодировке
Unicode.
Символьный тип относится к встроенным типам данных С# и
соответствует стандартному классу Сhar библиотеки .Net из пространства имен System.
Слайд 4static void Main()
{
try
{
char b
= 'B', c = '\x64', d = '\uffff';
Console.WriteLine("{0}, {1}, {2}", b, c, d);
Console.WriteLine("{0}, {1}, {2}", char.ToLower(b), char.ToUpper(c), char.GetNumericValue(d));
char a;
do //цикл выполнятеся до тех пор, пока не ввели символ e
{
Console.WriteLine("Введите символ: ");
a = char.Parse(Console.ReadLine());
Console.WriteLine("Введен символ {0}, его код {1}, его категория {2}", a, (int)a, char.GetUnicodeCategory(a));
if (char.IsLetter(a)) Console.WriteLine("Буква");
if (char.IsUpper(a)) Console.WriteLine("Верхний регистр");
if (char.IsLower(a)) Console.WriteLine("Нижний регистр");
if (char.IsControl(a)) Console.WriteLine("Управляющий символ");
if (char.IsNumber(a)) Console.WriteLine("Число");
if (char.IsPunctuation(a)) Console.WriteLine("Разделитель");
} while (a != 'e');
}
catch
{
Console.WriteLine("Возникло исключение");
}
}
Слайд 6//Организация массива символов и работа с ним на основе базового
класса Array:
static void Main() {
char[] a ={ 'm', 'a', 'Х', 'i', 'M', 'u', 'S' , '!', '!', '!' };
char [] b="кол около колокола".ToCharArray(); //преобразование строки в массив символов
PrintArray("Исходный массив а:", a);
for (int x=0;x
if (char.IsLower(a[x])) a[x]=char.ToUpper(a[x]);
PrintArray("Измененный массив а:", a);
PrintArray("Исходный массив b:", b);
Array.Reverse(b);
PrintArray("Измененный массив b:", b);
}
static void PrintArray(string line, Array a)
{
Console.WriteLine(line);
foreach( object x in a) Console.Write(x);
Console.WriteLine('\n');
}
Слайд 7Неизменяемые строки string
Тип string, предназначенный для работы со стоками символов
в кодировке Unicode.
Ему соответствует базовый тип класса System.String библиотеки
.Net.
Каждый объект string - это неизменяемая последовательность символов Unicode, т.е. методы, предназначенные для изменения строк, возвращают измененные копии, исходные же строки остаются неизменными.
Слайд 11
вызов статических методов происходит через обращение к имени класса:
String.Concat(str1,
str2)
в остальных случаях через обращение к экземплярам класса:
str.ToLower()
Слайд 12class Program {
static void Main()
{
string
str1 = "Первая строка"; string str2 = string.Copy(str1);
string str3 = "Вторая строка«; string str4 = "ВТОРАЯ строка";
string strUp, strLow;
int result, idx;
Console.WriteLine("str1: " + str1); Console.WriteLine("str3: " + str3);
Console.WriteLine("str4: " + str4);
Console.WriteLine("Длина строки str1: " + str1.Length);
// Создаем прописную и строчную версии строки str1.
strLow = str1.ToLower(); strUp = str1.ToUpper();
Console.WriteLine("Строчная версия строки str1: " + strLow);
Console.WriteLine("Прописная версия строки str1: " + strUp);
Console.WriteLine();
// Сравниваем строки,
result = str1.CompareTo(str3);
if (result == 0) Console.WriteLine("str1 и str3 равны.");
else if (result < 0) Console.WriteLine("str1 меньше, чем str3");
else Console.WriteLine("str1 больше, чем str3");
Console.WriteLine();
Слайд 13 //сравниваем строки без учета регистра
result = String.Compare(str3, str4, true);
if (result == 0) Console.WriteLine("str3 и str4 равны без учета регистра.");
else Console.WriteLine("str3 и str4 не равны без учета регистра.");
Console.WriteLine();
//сравниваем части строк
result = String.Compare(str1, 4, str2, 4, 2);
if (result == 0) Console.WriteLine("часть str1 и str2 равны");
else Console.WriteLine("часть str1 и str2 не равны"); Console.WriteLine();
// Поиск строк.
idx = str2.IndexOf("строка");
Console.WriteLine("Индекс первого вхождения подстроки строка: " + idx);
idx = str2.LastIndexOf("о");
Console.WriteLine("Индекс последнего вхождения символа о: " + idx);
//конкатенация
string str = String.Concat(str1, str2, str3, str4);
Console.WriteLine("конкатенация"+ str);
//удаление подстроки
str = str.Remove(0, str1.Length); Console.WriteLine(str);
//замена подстроки "строка" на пустую подстроку
str = str.Replace("строка", ""); Console.WriteLine(str);
} } }
Слайд 15class Program
{
// методы разделения строки на
элементы Split и слияние массива строк в единую строку Join
static
void Main()
{
string poems = "тучки небесные вечные странники";
char[] div = { ' '}; //создаем массив разделителей
// Разбиваем строку на части,
string[] parts = poems.Split(div);
Console.WriteLine("Результат разбиения строки на части: ");
for (int i = 0; i < parts.Length; i++)
Console.WriteLine(parts[i]);
// Теперь собираем эти части в одну строку, в качестве разделителя используем символ |
string whole = String.Join(" | ", parts);
Console.WriteLine("Результат сборки: ");
Console.WriteLine(whole);
} }
Слайд 16При работе с объектами класса string нужно учитывать их свойство
неизменяемости, т.е. методы изменяют не сами строки, а их копии.
string a="";
for (int i = 1; i <= 100; i++) a +="!";
Console.WriteLine(a);
В этом случае в памяти компьютера будет сформировано 100 различных строк вида:
!
!!
!!!
…
!!!...!!
Только последняя строка будет храниться в переменной а.
Ссылки на все остальные строчки будут потеряны, но эти строки будут храниться в памяти компьютера и засорять память. Бороться с таким засорением придется сборщику мусора, что будет сказываться на производительности программы, поэтому если нужно изменять строку, то лучше пользоваться классом StringBuilder.
Слайд 17Изменяемые строки
Чтобы создать строку, которую можно изменять, в С# предусмотрен
класс StringBuilder, определенный в пространстве имен System.Text. Объекты этого класса
всегда объявляются с явным вызовом конструктора класса (через операцию new) .
Слайд 18static void Main() {
try {
StringBuilder str=new StringBuilder("Площадь"); PrintString(str);
str.Append(" треугольника равна"); PrintString(str);
str.AppendFormat(" {0} см
", 123.456); PrintString(str);
str.Insert(8, "данного "); PrintString(str);
str.Remove(7, 21); PrintString(str);
str.Replace("а", "о"); PrintString(str);
StringBuilder str1=new StringBuilder(Console.ReadLine());
StringBuilder str2=new StringBuilder(Console.ReadLine());
Console.WriteLine(str1.Equals(str2));
}
catch
{
Console.WriteLine("Вознико исключение"); }
}
static void PrintString(StringBuilder a) {
Console.WriteLine("Строка: "+a);
Console.WriteLine("Текущая длина строки " +a.Length);
Console.WriteLine("Объем буфера "+a.Capacity);
Console.WriteLine("Максимальный объем буфера "+a.MaxCapacity);
Console.WriteLine();
}
Слайд 20using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2 {
class Program
{
//С изменяемой строкой можно работать не
только как с объектом, но как с массивом символов:
static void Main()
{
StringBuilder a = new StringBuilder("2*3=3*2");
Console.WriteLine(a);
int k = 0;
for (int i = 0; i < a.Length; ++i)
if (char.IsDigit(a[i])) k += int.Parse(a[i].ToString());
Console.WriteLine(k);
}
}
}
Слайд 21Регулярные выражения
Регулярное выражение – это шаблон, по которому выполняется поиск
соответствующего фрагмента текста.
Эффективный поиск в тексте по заданному шаблону;
Редактирование текста;
Формирование
итоговых отчетов по результатам работы с текстом.
Слайд 22Метасимволы в регулярных выражениях
Язык описания регулярных выражений состоит из символов
двух видов: обычных символов и метасимволов.
Обычный символ представляет в
выражении сам себя, а метасимвол – некоторый класс символов.
Слайд 24Кроме метасимволов, обозначающие классы символов, могут применяться уточняющие метасимволы:
Слайд 25Повторители – метасимволы, которые располагаются непосредственно после обычного символа или
группы символов и задают количество его повторений в выражении
Слайд 26Регулярное выражение записывается в виде строкового литерала, перед строкой необходимо
ставить символ @.
Символ @ можно не ставить, если в
качестве шаблона используется шаблон без метасимволов.
Если нужно найти какой-то символ, который является метасимволом (например, точку), можно это сделать защитив ее обратным слэшем. Т.е. просто точка означает любой одиночный символ, а \. означает просто точку.
Примеры регулярных выражений:
слово rus – @"rus" или "rus"
№ телефона в формате xxx-xx-xx –
@"\d\d\d-\d\d-\d\d" или @"\d{3}(-\d\d){2} "
номер автомобиля - @"[A-Z]\d{3}[A-Z]{2}\d{2,3}RUS"
Слайд 27Поиск в тексте по шаблону
Пространство имен библиотеки базовых классов System.Text.RegularExpressions
содержит все объекты платформы .NET Framework, имеющие отношение к регулярным
выражениям.
Класс, поддерживающий регулярные выражения, - класс Regex, он представляет неизменяемые откомпилированные регулярные выражения.
Для описания регулярного выражения в классе определено несколько перегруженных конструкторов:
Regex() – создает пустое выражение;
Regex(String) – создает заданное выражение;
Regex(String, RegexOptions) – создает заданное выражение и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать или нет прописные и строчные буквы).
Слайд 28
Поиск фрагментов строки, соответствующих заданному выражению, выполняется с помощью методов
класса Regex:
IsMach,
Mach,
Matches.
Слайд 29/*Метод IsMach возвращает true, если фрагмент, соответствующий выражению, в заданной
строке найден, и false в противном случае*/
using System;
using System.Collections.Generic;
using System.Linq;
using
System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3
{
class Program
{
static void Main()
{
Regex r = new Regex("собака", RegexOptions.IgnoreCase);
string text1 = "Кот в доме, собака в конуре.";
string text2 = "Котик в доме, собачка в конуре.";
Console.WriteLine(r.IsMatch(text1));
Console.WriteLine(r.IsMatch(text2)); }
} }
RegexOptions.IgnoreCase – означает, что регулярное выражение применяется без учеба регистра символов
Слайд 30 /* Можно использовать конструкцию выбора из нескольких элементов. Варианты
выбора перечисляются через вертикальную черту*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace
ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Regex r = new Regex("собака|кот",RegexOptions.IgnoreCase);
string text1 = "Кот в доме, собака в конуре.";
string text2 = "Котик в доме, собачка в конуре.";
Console.WriteLine(r.IsMatch(text1));
Console.WriteLine(r.IsMatch(text2));
} } }
Слайд 31 //есть ли в заданных строках номера телефона в формате
xx-xx-xx или xxx-xx-xx:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3
{
class Program
{
static void Main()
{
Regex r = new Regex(@"\d{2,3}(-\d\d){2}");
string text1 = "tel:123-45-67";
string text2 = "tel:no";
string text3 = "tel:12-34-56";
Console.WriteLine(r.IsMatch(text1));
Console.WriteLine(r.IsMatch(text2));
Console.WriteLine(r.IsMatch(text3));
} } }
Слайд 32 /*Метод Match класса Regex не просто определяет, содержится ли
текст, соответствующий шаблону, а возвращает объект класса Match – последовательность
фрагментов текста, совпавших с шаблоном*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3
{
class Program {
static void Main() {
Regex r = new Regex(@"\d{2,3}(-\d\d){2}");
string text = @"Контакты в Минске tel:123-45-67, 123-34-56; fax:123-56-45
Контакты в Бресте tel:12-34-56; fax:12-56-45";
Match tel = r.Match(text);
while (tel.Success)
{
Console.WriteLine(tel);
tel = tel.NextMatch(); }
} } }
Слайд 33 //подсчитать сумму целых чисел, встречающихся в тексте:
using System;
using System.Collections.Generic;
using
System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3{
class Program {
static void
Main() {
Regex r = new Regex(@"[-+]?\d+");
string text = @"5*10=50 -80/40=-2";
Match teg = r.Match(text);
int sum = 0;
while (teg.Success)
{
Console.WriteLine(teg);
sum += int.Parse(teg.ToString());
teg = teg.NextMatch();
}
Console.WriteLine("sum=" + sum);
} } }
Слайд 34 /*Метод Matches класса Regex возвращает объект класса MatchCollection –
коллекцию всех фрагментов заданной строки, совпавших с шаблоном. При этом
метод Matches многократно запускает метод Match, каждый раз начиная поиск с того места, на котором закончился предыдущий поиск*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
string text = @"5*10=50 -80/40=-2";
Regex theReg = new Regex(@"[-+]?\d+");
MatchCollection theMatches = theReg.Matches(text);
foreach (Match theMatch in theMatches)
{ Console.Write("{0} ", theMatch.ToString()); }
Console.WriteLine(); }
} }
Слайд 35Редактирование текста
// метод Replace класса Regex позволяет выполнять замену
одного фрагмента текста другим или удаление фрагментов текста:
using System;
using System.Collections.Generic;
using
System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3 {
class Program {
static void Main(string[] args) {
string text = @"Контакты в Минске tel:123-45-67, 123-34-56; fax:123-56-45.
Контакты в Бресте tel:12-34-56; fax:11-56-45";
Console.WriteLine("Старые данные\n" + text);
string newText = Regex.Replace(text, "123-", "890-");
Console.WriteLine("Новые данные\n" + newText);
}
}
}
Слайд 36using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3
{
class Program
{
// Удаление всех номеров телефонов
из текста:
static void Main()
{
string text = @"Контакты в Минске tel:123-45-67, 123-34-56; fax:123-56-45.
Контакты в Бресте tel:12-34-56; fax:12-56-45";
Console.WriteLine("Старые данные\n"+text);
string newText=Regex.Replace(text, @"\d{2,3}(-\d\d){2}", "");
Console.WriteLine("Новые данные\n" + newText);
}
}
}
Слайд 37using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication3
{
class Program
{
//Разбиение исходного текста на фрагменты:
static
void Main()
{
string text = @"Контакты в Минске tel:123-45-67, 123-34-56; fax:123-56-45.
Контакты в Бресте tel:12-34-56; fax:12-56-45";
string []newText=Regex.Split(text,"[ ,.:;]+");
foreach( string a in newText)
Console.WriteLine(a);
}
}
}