'

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

Понравилась презентация – покажи это...





Слайд 0

Строки и регулярные выражения 1 ©Павловская Т.А. (СПбГУ ИТМО)


Слайд 1

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


Слайд 2

©Павловская Т.А. (СПбГУ ИТМО) 3 Преодолевши какой ни на есть труд, человек чувствует удовольствие. Суворов А. В.


Слайд 3

©Павловская Т.А. (СПбГУ ИТМО) 4 Строки типа 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

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


Слайд 5

Иллюстрация неизменяемости строки string s1 = "Hello"; string s2 = s1; s1 += " and goodbye."; Console.WriteLine(s2); // результат - "Hello" ©Павловская Т.А. (СПбГУ ИТМО) 6


Слайд 6

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


Слайд 7

©Павловская Т.А. (СПбГУ ИТМО) 8


Слайд 8

©Павловская Т.А. (СПбГУ ИТМО) 9 Пример 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 ); прекрасная королева Изольда красная корова Изольда прекрасная! королева! Изольда


Слайд 9

©Павловская Т.А. (СПбГУ ИТМО) 10 Пример: разбиение текста на слова 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);


Слайд 10

©Павловская Т.А. (СПбГУ ИТМО) 11 Пример форматирования строк 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][:спецификатор_формата[число]]}


Слайд 11

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


Слайд 12

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


Слайд 13

Пустые строки и строки null Пустая строка — экземпляр объекта System.String, содержащий 0 символов: string s = ""; Для пустых строк можно вызывать методы. Строки со значениями null, напротив, не ссылаются на экземпляр объекта System.String, попытка вызвать метод для строки null вызовет исключение NullReferenceException. Однако строки null можно использовать в операциях объединения и сравнения с другими строками. ©Павловская Т.А. (СПбГУ ИТМО) 14


Слайд 14

©Павловская Т.А. (СПбГУ ИТМО) 15 Строки типа 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 сек.


Слайд 15

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


Слайд 16

©Павловская Т.А. (СПбГУ ИТМО) 17 Пример использования 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тыс.$


Слайд 17

©Павловская Т.А. (СПбГУ ИТМО) 18 Регулярные выражения Регулярное выражение — шаблон (образец), по которому выполняется поиск соответствующего ему фрагмента текста. тег html: <[^>]+> российский номер автомобиля: [A-Z]\d{3}[A-Z]{2}\d\dRUS IP-адрес: \d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d? Регулярные выражения предназначены для обработки текстовой информации и обеспечивают: эффективный поиск в тексте по заданному шаблону; редактирование, замену и удаление подстрок; формирование итоговых отчетов по результатам работы с текстом. Примеры упрощенные


Слайд 18

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


Слайд 19

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


Слайд 20

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


Слайд 21

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


Слайд 22

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


Слайд 23

©Павловская Т.А. (СПбГУ ИТМО) 24 Примеры простых регулярных выражений целое число (возможно, со знаком): [-+]?\d+ вещественное число (может иметь знак и дробную часть, отделенную точкой): [-+]?\d+\.?\d* российский номер автомобиля (упрощенно): [A-Z]\d{3}[A-Z]{2}\d\dRUS ip-адрес (упрощенно): (\d{1,3}\.){3}\d{1,3}


Слайд 24

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


Слайд 25

Использование класса Regex Обработчик регулярных выражений выполняет синтаксический разбор и компиляцию регулярного выражения, а также операции, сопоставляющие шаблон регулярного выражения с входной строкой. Обработчик можно использовать одним из двух способов: С помощью вызова статических методов класса Regex. Параметры метода содержат входную строку и шаблон регулярного выражения. С помощью создания объекта Regex посредством передачи регулярного выражения в конструктор класса. ©Павловская Т.А. (СПбГУ ИТМО) 26


Слайд 26

Методы класса Regex позволяют выполнять следующие действия: Определить, встречается ли во входном тексте шаблон регулярного выражения (метод IsMatch). Извлечь из текста одно или все вхождения, соответствующие шаблону регулярного выражения (методы Match или Matches). Заменить текст, соответствующий шаблону регулярного выражения (метод Replace). Разделить строку на массив строк (метод Split). ©Павловская Т.А. (СПбГУ ИТМО) 27


Слайд 27

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 ©Павловская Т.А. (СПбГУ ИТМО) 28 Пример использования Regex.IsMatch


Слайд 28

Пример использования 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. ©Павловская Т.А. (СПбГУ ИТМО) 29


Слайд 29

Или: 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 ©Павловская Т.А. (СПбГУ ИТМО) 30


Слайд 30

Еще пример использования 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. ©Павловская Т.А. (СПбГУ ИТМО) 31


Слайд 31

// Добавить $ перед десятичной цифрой: 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 ©Павловская Т.А. (СПбГУ ИТМО) 32 Пример использования Regex.Replace $$ - cимвол доллара ($). $& - вся сопоставленная подстрока.


Слайд 32

// помещает элементы нумерованного списка в массив строк: 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); } } } ©Павловская Т.А. (СПбГУ ИТМО) 33 Пример использования Regex.Split // Вывод: // Eggs // Bread // Milk // Coffee // Tea


Слайд 33

©Павловская Т.А. (СПбГУ ИТМО) 34 Разбиение строки на слова (метод 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


Слайд 34

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


Слайд 35

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


Слайд 36

©Павловская Т.А. (СПбГУ ИТМО) 37 Поиск повторяющихся слов в строке using System; using System.Text.RegularExpressions; public class Test { public static void Main() { Regex r = new Regex(@"\b(?<word>\w+)[.,:;!? ]\s*(\k<word>)\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


Слайд 37

©Павловская Т.А. (СПбГУ ИТМО) 38 Запоминание найденных фрагментов 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


Слайд 38

Пример РВ: поиск 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(); } } ©Павловская Т.А. (СПбГУ ИТМО) 39


Слайд 39

вызов метода DumpHRefs public static void Main() { string inputString = "My favorite web sites include:</P>" + "<A HREF=\"http://msdn2.microsoft.com\">" + "MSDN Home Page</A></P>" + "<A HREF=\"http://www.microsoft.com\">" + "Microsoft Corporation Home Page</A></P>" + "<A HREF=\"http://blogs.msdn.com/bclteam\">" + ".NET Base Class Library blog</A></P>"; 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 ©Павловская Т.А. (СПбГУ ИТМО) 40


Слайд 40

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


Слайд 41

Извлечение протокола и номера порта из 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(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/"); Match m = r.Match(url); if (m.Success) Console.WriteLine(r.Match(url).Result("${proto}${port}")); } } // output: // http:8080 ©Павловская Т.А. (СПбГУ ИТМО) 42


Слайд 42

^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/ ©Павловская Т.А. (СПбГУ ИТМО) 43


Слайд 43

Пример РВ: допустимый 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}))$"); } } ©Павловская Т.А. (СПбГУ ИТМО) 44


Слайд 44

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


Слайд 45

©Павловская Т.А. (СПбГУ ИТМО) 46


Слайд 46

©Павловская Т.А. (СПбГУ ИТМО) 47


Слайд 47

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); } } } ©Павловская Т.А. (СПбГУ ИТМО) 48 // 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


Слайд 48

Пример РВ: замена формата даты метод Regex.Replace заменяет даты в форме мм/дд/гг на даты в форме дд-мм-гг. static string MDYToDMY(string input) { return Regex.Replace(input, "\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b", "${day}-${month}-${year}"); } ©Павловская Т.А. (СПбГУ ИТМО) 49


Слайд 49

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


Слайд 50

Пример вызова метода 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. ©Павловская Т.А. (СПбГУ ИТМО) 51


Слайд 51

©Павловская Т.А. (СПбГУ ИТМО) 52 Механизм НКА Формальной моделью алгоритма распознавания лексем, обозначаемых регулярным выражением, является конечный автомат. НКА - недетерминированный конечный автомат (допускает более одного перехода из каждого состояния) Общие правила разбора: предпочтение отдается совпадению, ближайшему к началу строки (левее) модификаторы – жадные В НКА выполняется возврат к предыдущему сохраненному состоянию по принципу LIFO Регулярное выражение должно: - находить то, что надо - не находить то, чего не надо


Слайд 52

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


Слайд 53

©Павловская Т.А. (СПбГУ ИТМО) 54 Примеры жадности say "yes" instead of "yeah", please ".*" "[^"]*" in 1991 there were 2 056 items ^.*(\d\d) ^.*(\d+) => "yes" instead of "yeah" => "yes" => 56 => 6


Слайд 54

//Выделить ноль или несколько раз (ленивое совпадение): *? 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. ©Павловская Т.А. (СПбГУ ИТМО) 55


Слайд 55

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


×

HTML:





Ссылка: