Строки и регулярные выражения

Содержание

Слайд 2

©Павловская Т.А. (НИУ ИТМО) Строки в C# string StringBuilder символы (тип char) - самостоятельно

©Павловская Т.А. (НИУ ИТМО)

Строки в C#

string
StringBuilder
символы (тип char) - самостоятельно

Слайд 3

©Павловская Т.А. (НИУ ИТМО) Строки типа string Тип string предназначен для

©Павловская Т.А. (НИУ ИТМО)

Строки типа string

Тип string предназначен для работы

со строками символов в кодировке Unicode. Ему соответствует базовый класс System.String библиотеки .NET.
Создание строки:
string s; // инициализация отложена
string t = "qqq"; // инициализация строковым литералом
string u = new string(' ', 20); // с пом. конструктора
string v = new string( a ); // создание из массива символов
// создание массива символов: char[] a = { '0', '0', '0' };
Слайд 4

©Павловская Т.А. (НИУ ИТМО) Операции для строк присваивание (=); проверка на

©Павловская Т.А. (НИУ ИТМО)

Операции для строк

присваивание (=);
проверка на равенство (==);
проверка на

неравенство (!=);
обращение по индексу ([]);
сцепление (конкатенация) строк (+).
Строки равны, если имеют одинаковое количество символов и совпадают посимвольно.
Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Это связано с тем, что строки типа string относятся к неизменяемым типам данных.
Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые «старые» копии автоматически удаляются сборщиком мусора.
Слайд 5

©Павловская Т.А. (НИУ ИТМО) Некоторые элементы класса System.String

©Павловская Т.А. (НИУ ИТМО)

Некоторые элементы класса System.String

Слайд 6

©Павловская Т.А. (НИУ ИТМО)

©Павловская Т.А. (НИУ ИТМО)

Слайд 7

©Павловская Т.А. (НИУ ИТМО) Пример string s = "прекрасная королева"; Console.WriteLine(

©Павловская Т.А. (НИУ ИТМО)

Пример

string s = "прекрасная королева";
Console.WriteLine( s

);
string sub = s.Substring( 3 ).Remove( 12, 2 ); // 1
Console.WriteLine( sub );
string[] mas = s.Split(' '); // 2
string joined = string.Join( "! ", mas );
Console.WriteLine( joined );
прекрасная королева
красная корова
прекрасная! королева
Слайд 8

©Павловская Т.А. (НИУ ИТМО) Пример: разбиение текста на слова StreamReader inputFile

©Павловская Т.А. (НИУ ИТМО)

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

StreamReader inputFile = new

StreamReader("example.txt");
string text = inputFile.ReadToEnd();
char[] delims = ".,;:!?\n\xD\xA\" ".ToCharArray();
string[] words = text.Split(delims,
StringSplitOptions.RemoveEmptyEntries);
foreach (string word in words) Console.WriteLine(word);
Console.WriteLine("Cлов в тексте: " + words.Length);
// слова, оканчивающиеся на «а»:
foreach (string word in words)
if (word[word.Length-1] == 'а') Console.WriteLine(word);
Слайд 9

©Павловская Т.А. (НИУ ИТМО) Пример форматирования строк double a = 12.234;

©Павловская Т.А. (НИУ ИТМО)

Пример форматирования строк

double a = 12.234;
int b =

29;
Console.WriteLine( " a = {0,6:C} b = {1,2:X}", a, b );
Console.WriteLine( " a = {0,6:0.##} b = {1,5:0.# ' руб. '}", a, b);
Console.WriteLine(" a = {0:F3} b = {1:D3}", a, b);
Console.WriteLine( " a = " + a.ToString("C"));
a = 12,23p. b = 1D
a = 12,23 b = 29 руб.
a = 12,234 b = 029
a = 12,23p.
{n[,m][:спецификатор_формата[число]]}
Слайд 10

©Павловская Т.А. (НИУ ИТМО) Спецификаторы формата для строк

©Павловская Т.А. (НИУ ИТМО)

Спецификаторы формата для строк

Слайд 11

©Павловская Т.А. (НИУ ИТМО) Примеры пользовательских шаблонов

©Павловская Т.А. (НИУ ИТМО)

Примеры пользовательских шаблонов

Слайд 12

Пустые строки и строки null Пустая строка — экземпляр объекта System.String,

Пустые строки и строки null

Пустая строка — экземпляр объекта System.String, содержащий

0 символов:
string s = "";
Для пустых строк можно вызывать методы.
Строки со значениями null, напротив, не ссылаются на экземпляр объекта System.String, попытка вызвать метод для строки null вызовет исключение NullReferenceException. Однако строки null можно использовать в операциях объединения и сравнения с другими строками.

©Павловская Т.А. (НИУ ИТМО)

Слайд 13

©Павловская Т.А. (НИУ ИТМО) Строки типа StringBuilder Класс StringBuilder определен в

©Павловская Т.А. (НИУ ИТМО)

Строки типа StringBuilder

Класс StringBuilder определен в пространстве

имен System.Text. Позволяет изменять значение своих экземпляров.
При создании экземпляра обязательно использовать операцию new и конструктор, например:
StringBuilder a = new StringBuilder(); // 1
StringBuilder b = new StringBuilder( "qwerty" ); // 2
StringBuilder c = new StringBuilder( 100 ); // 3
StringBuilder d = new StringBuilder( "qwerty", 100 ); // 4
StringBuilder e = new StringBuilder( "qwerty", 1, 3, 100 );// 5
Конкатенация 50000 string ~ 1 мин., StringBuilder ~ 1 сек.

Работа с копиями копий строк может в конце концов надоесть.
Э. Троелсен

Слайд 14

©Павловская Т.А. (НИУ ИТМО) Основные элементы класса System.Text.StringBuilder

©Павловская Т.А. (НИУ ИТМО)

Основные элементы класса System.Text.StringBuilder

Слайд 15

©Павловская Т.А. (НИУ ИТМО) Пример использования StringBuilder Console.Write( "Введите зарплату: "

©Павловская Т.А. (НИУ ИТМО)

Пример использования StringBuilder

Console.Write( "Введите зарплату: " );
double salary

= double.Parse( Console.ReadLine() );
StringBuilder a = new StringBuilder();
a.Append( "зарплата " );
a.AppendFormat( "{0, 6:C} - в год {1, 6:C}",
salary, salary * 12 );
Console.WriteLine( a );
a.Replace( "р.", "тыс.$" );
Console.WriteLine( "А лучше было бы: " + a );
Введите зарплату: 3500
зарплата 3 500,00р. - в год 42 000,00р.
А лучше было бы: зарплата 3 500,00тыс.$ - в год 42 000,00тыс.$
Слайд 16

©Павловская Т.А. (НИУ ИТМО) Регулярные выражения Регулярное выражение — шаблон (образец),

©Павловская Т.А. (НИУ ИТМО)

Регулярные выражения

Регулярное выражение — шаблон (образец), по которому выполняется

поиск соответствующего ему фрагмента текста.
тег html:
<[^>]+>
российский номер автомобиля:
[A-Z]\d{3}[A-Z]{2}\d\dRUS
IP-адрес:
\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?
Регулярные выражения предназначены для обработки текстовой информации и обеспечивают:
эффективный поиск в тексте по заданному шаблону;
редактирование, замену и удаление подстрок;
формирование итоговых отчетов по результатам работы с текстом.

Примеры упрощенные

Слайд 17

©Павловская Т.А. (НИУ ИТМО) Язык описания регулярных выражений Язык описания регулярных

©Павловская Т.А. (НИУ ИТМО)

Язык описания регулярных выражений

Язык описания регулярных выражений состоит

из символов двух видов: обычных и метасимволов.
Обычный символ представляет в выражении сам себя.
Метасимвол:
класс символов (например, любая цифра \d или буква \w)
уточняющий символ (например, ^).
повторитель (например, +).
Примеры:
выражение для поиска в тексте фрагмента «Вася» записывается с помощью четырех обычных символов «Вася»
выражение для поиска двух цифр, идущих подряд, состоит из двух метасимволов «\d\d»
выражение для поиска фрагментов вида «Вариант 1», «Вариант 2», …, «Вариант 9» имеет вид «Вариант \d»
выражение для поиска фрагментов вида «Вариант 1», «Вариант 23», «Вариант 719», …, имеет вид «Вариант \d+»
Слайд 18

©Павловская Т.А. (НИУ ИТМО) Метасимволы - классы символов

©Павловская Т.А. (НИУ ИТМО)

Метасимволы - классы символов

Слайд 19

©Павловская Т.А. (НИУ ИТМО) продолжение таблицы

©Павловская Т.А. (НИУ ИТМО)

продолжение таблицы

Слайд 20

©Павловская Т.А. (НИУ ИТМО) Уточняющие (якорные) метасимволы ^cat cat$ ^cat$ ^$

©Павловская Т.А. (НИУ ИТМО)

Уточняющие (якорные) метасимволы

^cat

cat$

^cat$

^$

Слайд 21

©Павловская Т.А. (НИУ ИТМО) Повторители

©Павловская Т.А. (НИУ ИТМО)

Повторители

Слайд 22

©Павловская Т.А. (НИУ ИТМО) Примеры простых регулярных выражений целое число (возможно,

©Павловская Т.А. (НИУ ИТМО)

Примеры простых регулярных выражений

целое число (возможно, со

знаком):
[-+]?\d+
вещественное число (может иметь знак и дробную часть, отделенную точкой):
[-+]?\d+\.?\d*
российский номер автомобиля (упрощенно):
[A-Z]\d{3}[A-Z]{2}\d\dRUS
ip-адрес (упрощенно):
(\d{1,3}\.){3}\d{1,3}
Слайд 23

Поддержка регулярных выражений в .NET Для поддержки регулярных выражений в библиотеку

Поддержка регулярных выражений в .NET

Для поддержки регулярных выражений в библиотеку .NET

включены классы, объединенные в пространство имен System.Text.RegularExpressions.
Основной класс – Regex. Он реализует подсистему обработки регулярных выражений.
Подсистеме требуется предоставить:
Шаблон (регулярное выражение), соответствия которому требуется найти в тексте.
Текст, который требуется проанализировать с помощью шаблона.
См.:
http://msdn.microsoft.com/ru-ru/library/hs600312.aspx?ppud=4

©Павловская Т.А. (НИУ ИТМО)

Слайд 24

Использование класса Regex Обработчик регулярных выражений выполняет синтаксический разбор и компиляцию

Использование класса Regex

Обработчик регулярных выражений выполняет синтаксический разбор и компиляцию регулярного

выражения, а также операции, сопоставляющие шаблон регулярного выражения с входной строкой.
Обработчик можно использовать одним из двух способов:
С помощью вызова статических методов класса Regex. Параметры метода содержат входную строку и шаблон регулярного выражения.
С помощью создания объекта Regex посредством передачи регулярного выражения в конструктор класса.

©Павловская Т.А. (НИУ ИТМО)

Слайд 25

Методы класса Regex позволяют выполнять следующие действия: Определить, встречается ли во

Методы класса Regex

позволяют выполнять следующие действия:
Определить, встречается ли во

входном тексте шаблон регулярного выражения (метод IsMatch).
Извлечь из текста одно или все вхождения, соответствующие шаблону регулярного выражения (методы Match или Matches).
Заменить текст, соответствующий шаблону регулярного выражения (метод Replace).
Разделить строку на массив строк (метод Split).

©Павловская Т.А. (НИУ ИТМО)

Слайд 26

using System; using System.Text.RegularExpressions; public class Example { public static void

using System;
using System.Text.RegularExpressions;
public class Example
{ public static void

Main()
{ string[] values = { "111-22-3333", "111-2-3333"};
string pattern = @"^\d{3}-\d{2}-\d{4}$";
foreach (string value in values)
{ if (Regex.IsMatch(value, pattern))
Console.WriteLine("{0} is a valid SSN.", value);
else Console.WriteLine("{0}: Invalid", value);
} } }
// Вывод:
// 111-22-3333 is a valid SSN.
// 111-2-3333: Invalid

©Павловская Т.А. (НИУ ИТМО)

Пример использования Regex.IsMatch

Слайд 27

Пример использования Regex.Matches // совпадения со строкой "abc" во входной строке

Пример использования Regex.Matches

// совпадения со строкой "abc" во входной строке
using System;


using System.Text.RegularExpressions;
public class Example
{ public static void Main()
{ string pattern = "abc";
string input = "abc123abc456abc789";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("{0} found at position {1}.",
match.Value, match.Index);
} }
//Вывод:
// abc found at position 0.
// abc found at position 6.
// abc found at position 12.

©Павловская Т.А. (НИУ ИТМО)

Слайд 28

Или: using System; using System.Text.RegularExpressions; public class Example { public static

Или:

using System;
using System.Text.RegularExpressions;
public class Example
{ public static void

Main()
{ string pattern = "abc";
string input = "abc123abc456abc789";
Match match = Regex.Match(input, pattern);
while (match.Success)
{ Console.WriteLine("{0} found at position {1}.",
match.Value, match.Index);
match = match.NextMatch();
} } }
// создание экземпляра класса Match

©Павловская Т.А. (НИУ ИТМО)

Слайд 29

Еще пример использования Regex.Matches string pattern = @"\b91*9*\b"; string input =

Еще пример использования Regex.Matches

string pattern = @"\b91*9*\b";
string input = "99

95 919 929 9119 9219 999 9919 91119";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("'{0}' found at position {1}.",
match.Value, match.Index);
// Вывод:
// '99' found at position 0.
// '919' found at position 6.
// '9119' found at position 14.
// '999' found at position 24.
// '91119' found at position 33.

©Павловская Т.А. (НИУ ИТМО)

Слайд 30

// Добавить $ перед десятичной цифрой: using System; using System.Text.RegularExpressions; public

// Добавить $ перед десятичной цифрой:
using System;
using System.Text.RegularExpressions;
public class

Example
{ public static void Main()
{ string pattern = @"\b\d+\.\d{2}\b";
string replacement = "$$$&";
string input = "Total Cost: 103.64";
Console.WriteLine(Regex.Replace(input, pattern,
replacement));
} }
// Вывод:
// Total Cost: $103.64

©Павловская Т.А. (НИУ ИТМО)

Пример использования Regex.Replace

$$ - cимвол доллара ($).
$& - вся сопоставленная подстрока.

Слайд 31

// помещает элементы нумерованного списка в массив строк: using System; using

// помещает элементы нумерованного списка в массив строк:
using System;
using System.Text.RegularExpressions;


public class Example
{ public static void Main()
{ string input = "1. Eggs 2. Bread 3. Milk 4. Coffee 5. Tea";
string pattern = @"\b\d{1,2}\.\s";
foreach (string item in Regex.Split(input, pattern))
{ if (! String.IsNullOrEmpty(item))
Console.WriteLine(item);
}
}
}

©Павловская Т.А. (НИУ ИТМО)

Пример использования Regex.Split

// Вывод:
// Eggs
// Bread
// Milk
// Coffee
// Tea

Слайд 32

©Павловская Т.А. (НИУ ИТМО) Разбиение строки на слова (метод Split) public

©Павловская Т.А. (НИУ ИТМО)

Разбиение строки на слова (метод Split)

public static

void Main()
{
string text = "Салат - $4, борщ -$3, одеколон - $10.";
string pattern = "[- ,.]+";
Regex r = new Regex( pattern );
string [] words = r.Split(text);
foreach ( string word in words ) Console.WriteLine( word );
}

Результат:
Салат
$4
Борщ
$3
Одеколон
$10

Слайд 33

Пример РВ: удаление символов Метод CleanInput используется для удаления потенциально опасных

Пример РВ: удаление символов

Метод CleanInput используется для удаления потенциально опасных символов,

введенных в текстовое поле пользователем (не являющихся алфавитно-цифровыми, за исключением @ - ..
using System;
using System.Text.RegularExpressions;
public class Example
{
static string CleanInput(string strIn)
{ return Regex.Replace(strIn, @"[^\w\.@-]", ""); }
}
шаблон регулярного выражения [^\w\.@-\\%] также разрешает знак процента и обратную косую черту во входной строке.

©Павловская Т.А. (НИУ ИТМО)

Слайд 34

©Павловская Т.А. (НИУ ИТМО) Группирование Группирование (c помощью круглых скобок) применяется

©Павловская Т.А. (НИУ ИТМО)

Группирование

Группирование (c помощью круглых скобок) применяется во многих

случаях:
требуется задать повторитель не для отдельного символа, а для последовательности;
для запоминания фрагмента, совпавшего с выражением, заключенным в скобки, в некоторой переменной. Имя переменной задается в угловых скобках или апострофах:
(?<имя_переменной>фрагмент_выражения)
например: номера телефонов в виде nnn-nn-nn запоминаются в переменной num:
(?\d\d\d-\d\d-\d\d)
для формирования обратных ссылок:
(\w)\1 – поиск сдвоенных символов
(?\w+) (\k) – поиск повторяющихся слов, разделенных пробелом
Слайд 35

©Павловская Т.А. (НИУ ИТМО) Поиск повторяющихся слов в строке using System;

©Павловская Т.А. (НИУ ИТМО)

Поиск повторяющихся слов в строке

using System;
using System.Text.RegularExpressions;
public

class Test
{ public static void Main()
{
Regex r = new Regex(@"\b(?\w+)[.,:;!? ]\s*(\k)\b",
RegexOptions.IgnoreCase );
string s1 = "Oh, oh! Give me more!";
if ( r.IsMatch( tst1 ) ) Console.WriteLine( " s1 yes" );
else Console.WriteLine( " s1 no" );
string s2 = "Oh give me, give me more!";
if ( r.IsMatch( tst2 ) ) Console.WriteLine( " s2 yes" );
else Console.WriteLine( " s2 no" );
}
}

Результат работы программы:
tst1 yes
tst2 no

Результат работы программы после замены \s на .
tst1 yes
tst2 yes

Слайд 36

©Павловская Т.А. (НИУ ИТМО) Запоминание найденных фрагментов public static void Main()

©Павловская Т.А. (НИУ ИТМО)

Запоминание найденных фрагментов

public static void Main()
{

string text = "Салат - $4, борщ - $3, одеколон - $10.";
string pattern = @"(\w+) - \$(\d+)[.,]";
Regex r = new Regex( pattern );
Match m = r.Match( text );
int total = 0;
while ( m.Success )
{
Console.WriteLine( m );
total += int.Parse( m.Groups[2].ToString() );
m = m.NextMatch();
}
Console.WriteLine( "Итого: $" + total );
}

Результат:
Салат - $4,
борщ - $3,
одеколон - $10.
Итого: $17

Слайд 37

Пример РВ: поиск href поиск и печать всех значений href="..." и

Пример РВ: поиск href

поиск и печать всех значений href="..." и их

позиций во входной строке.
private static void DumpHRefs(string inputString)
{ Match m;
string HRefPattern = "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";
m = Regex.Match(inputString, HRefPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
while (m.Success)
{ Console.WriteLine(
"Found href " + m.Groups[1] + " at " +
m.Groups[1].Index);
m = m.NextMatch();
}
}

©Павловская Т.А. (НИУ ИТМО)

Слайд 38

вызов метода DumpHRefs public static void Main() { string inputString =

вызов метода DumpHRefs

public static void Main()
{ string inputString = "My

favorite web sites include:

" + "" + "MSDN Home Page

" + "" + "Microsoft Corporation Home Page

" + "" + ".NET Base Class Library blog

";
DumpHRefs(inputString);
}
// Оutput:
// Found href http://msdn2.microsoft.com at 43
// Found href http://www.microsoft.com at 102
// Found href http://blogs.msdn.com/bclteam at 176

©Павловская Т.А. (НИУ ИТМО)

Слайд 39

href\s*=\s*(?:"(? [^""]*)"|(? \S+)) ©Павловская Т.А. (НИУ ИТМО)

href\s*=\s*(?:"(?<1>[^""]*)"|(?<1>\S+))

©Павловская Т.А. (НИУ ИТМО)

Слайд 40

Извлечение протокола и номера порта из URL-адреса using System; using System.Text.RegularExpressions;

Извлечение протокола и номера порта из URL-адреса

using System;
using System.Text.RegularExpressions;
public

class Example
{ public static void Main()
{ string url = "http://www.contoso.com:8080/letters/readme.html";
Regex r = new Regex(@"^(?\w+)://[^/]+?(?:\d+)?/");
Match m = r.Match(url);
if (m.Success)
Console.WriteLine(r.Match(url).Result("${proto}${port}"));
}
}
// output:
// http:8080

©Павловская Т.А. (НИУ ИТМО)

Слайд 41

^(? \w+)://[^/]+?(? :\d+)?/ ©Павловская Т.А. (НИУ ИТМО)

^(?\w+)://[^/]+?(?:\d+)?/

©Павловская Т.А. (НИУ ИТМО)

Слайд 42

Пример РВ: допустимый e-mail адрес Метод IsValidEmail возвращает значение true, если

Пример РВ: допустимый e-mail адрес

Метод IsValidEmail возвращает значение true, если строка

содержит допустимый адрес электронной почты, и значение false, если нет.
using System;
using System.Text.RegularExpressions;
public class RegexUtilities
{ public static bool IsValidEmail(string strIn)
{ return Regex.IsMatch(strIn, @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" + @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$");
}
}

©Павловская Т.А. (НИУ ИТМО)

Слайд 43

©Павловская Т.А. (НИУ ИТМО) @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))

©Павловская Т.А. (НИУ ИТМО)

@"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))

Слайд 44

©Павловская Т.А. (НИУ ИТМО)

©Павловская Т.А. (НИУ ИТМО)

Слайд 45

©Павловская Т.А. (НИУ ИТМО)

©Павловская Т.А. (НИУ ИТМО)

Слайд 46

public class Application { public static void Main() { string[] emailAddresses

public class Application
{ public static void Main()
{ string[] emailAddresses

= { "david.jones@proseware.com", "d.j@server1.proseware.com", "jones@ms1.proseware.com", "j.@server1.proseware.com",
"j@proseware.com9",
"js#internal@proseware.com", "j_9@[129.126.118.1]",
"j..s@proseware.com",
"js*@proseware.com",
"js@proseware..com",
"js@proseware.com9",
"j.s@server1.proseware.com" };
foreach (string emailAddress in emailAddresses)
{ if (RegexUtilities.IsValidEmail(emailAddress)) Console.WriteLine("Valid: {0}", emailAddress);
else Console.WriteLine("Invalid: {0}", emailAddress); } } }

©Павловская Т.А. (НИУ ИТМО)

// output:
// Valid: david.jones@proseware.com
// Valid: d.j@server1.proseware.com
// Valid: jones@ms1.proseware.com
// Invalid: j.@server1.proseware.com
// Invalid: j@proseware.com9
// Valid: js#internal@proseware.com
// Valid: j_9@[129.126.118.1]
// Invalid: j..s@proseware.com
// Invalid: js*@proseware.com
// Invalid: js@proseware..com
// Invalid: js@proseware.com9
// Valid: j.s@server1.proseware.com

Слайд 47

Пример РВ: замена формата даты метод Regex.Replace заменяет даты в форме

Пример РВ: замена формата даты

метод Regex.Replace заменяет даты в форме мм/дд/гг

на даты в форме дд-мм-гг.
static string MDYToDMY(string input)
{ return Regex.Replace(input, "\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b", "${day}-${month}-${year}"); }

©Павловская Т.А. (НИУ ИТМО)

Слайд 48

"\\b(? \\d{1,2})/(? \\d{1,2})/(? \\d{2,4})\\b", "${day}-${month}-${year} ©Павловская Т.А. (НИУ ИТМО)

"\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b", "${day}-${month}-${year}

©Павловская Т.А. (НИУ ИТМО)

Слайд 49

Пример вызова метода MDYToDMY using System; using System.Globalization; using System.Text.RegularExpressions; public

Пример вызова метода MDYToDMY

using System;
using System.Globalization;
using System.Text.RegularExpressions;
public class

Class1
{ public static void Main()
{ string dateString = DateTime.Today.ToString("d",
DateTimeFormatInfo.InvariantInfo);
string resultString = MDYToDMY(dateString);
Console.WriteLine("Converted {0} to {1}.", dateString,
resultString);
}
// Вывод, если было запущено 8/21/2007:
// Converted 08/21/2007 to 21-08-2007.

©Павловская Т.А. (НИУ ИТМО)

Слайд 50

©Павловская Т.А. (НИУ ИТМО) Механизм НКА Формальной моделью алгоритма распознавания лексем,

©Павловская Т.А. (НИУ ИТМО)

Механизм НКА

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

выражением, является конечный автомат.
НКА - недетерминированный конечный автомат (допускает более одного перехода из каждого состояния)
Общие правила разбора:
предпочтение отдается совпадению, ближайшему к началу строки (левее)
модификаторы – жадные
В НКА выполняется возврат к предыдущему сохраненному состоянию по принципу LIFO

Регулярное выражение должно:
- находить то, что надо
- не находить то, чего не надо

Слайд 51

Жадные и нежадные повторители ©Павловская Т.А. (НИУ ИТМО)

Жадные и нежадные повторители

©Павловская Т.А. (НИУ ИТМО)

Слайд 52

©Павловская Т.А. (НИУ ИТМО) Примеры жадности say "yes" instead of "yeah",

©Павловская Т.А. (НИУ ИТМО)

Примеры жадности

say "yes" instead of "yeah", please
".*"
"[^"]*"
in

1991 there were 2 056 items
.*(\d\d)
.*(\d+)

=> "yes" instead of "yeah"

=> "yes"

=> 56

=> 6

Слайд 53

//Выделить ноль или несколько раз (ленивое совпадение): *? string pattern =

//Выделить ноль или несколько раз (ленивое совпадение): *?
string pattern = @"\b\w*?oo\w*?\b";

string input = "woof root root rob oof woo woe";
foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
Console.WriteLine("'{0}' found at position {1}.",
match.Value, match.Index);
//Вывод:
// 'woof' found at position 0.
// 'root' found at position 5.
// 'root' found at position 10.
// 'oof' found at position 19.
// 'woo' found at position 23.

©Павловская Т.А. (НИУ ИТМО)