|
Программирование >> Обработка исключительных ситуаций
360 Глава 15. Дополнительные средства С# Начнем с класса Regex, представляющего собственно регулярное выражение. Класс является неизменяемым, то есть после создания экземпляра его корректировка не допускается. Для описания регулярного выражения в классе определено несколько перегруженных конструкторов: Regex () - создает пустое выражение; Regex(String) - создает заданное выражение; RegexCString, RegexOptions) - создает заданное выражение и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать или не различать прописные и строчные буквы). Пример конструктора, задающего выражение для поиска в тексте повторяющихся слов, расположенных подряд и разделенных произвольным количеством пробелов, независимо от регистра: Regex гх = new Regex( @ \b(?<word>\w+)\s+(\k<word>)\b . RegexOpti ons.IgnoreCase ); Поиск фрагментов строки, соответствующих заданному выражению, выполняется с помощью методов IsMatch, Match и Matches. Метод IsMatch возвращает true, если фрагмент, соответствующий выражению, в заданной строке найден, и false в противном случае. В листинге 15.3 приведен пример поиска повторяющихся слов в двух тестовых строках. В регулярное выражение, приведенное ранее, добавлен фрагмент, позволяющий распознавать знаки препинания. Листинг 15.3. Поиск в строке дублированных слов (методом IsMatch) using System; usi ng System.Text.RegularExpressions; public class Test { public static void MainO Regex r = new Regex( @ \b(?<word>\w+)[.,:;!? ]\s*(\k<word>)\b , RegexOptions.IgnoreCase ) ; string tstl = Oh. oh! Give me more! ; if ( r.IsMatch( tstl ) ) Console.WriteLine( tstl yes ); else Console.WriteLine( tstl no ); string tst2 = Oh give me. give me more! ; if ( r.IsMatch( tst2 ) ) Console.WriteLineC tst2 yes ); else Console.WriteLine( tst2 no ); Результат работы программы: tstl yes tst2 no Регулярные выражения 361 Повторяющиеся слова в строке tst2 располагаются не подряд, поэтому она не соответствует регулярному выражению. Для поиска повторяющихся слов, расположенных в произвольных позициях строки, в регулярном выражении нужно всего-навсего заменить пробел (\s) любым символом (.) : Regex г = new Regex( <a \b(?<word>\w+)[..:;!? ].*(\k<word>)\b . RegexOptions.IgnoreCase ) ; Метод Match класса Regex, в отличие от метода IsMatch, не просто определяет, произошло ли совпадение, а возвращает объект класса Match - очередной фрагмент, совпавший с образцом. Рассмотрим листинг 15.4, в котором используется этот метод. Листинг 15.4. Выделение из строки слов и чисел (методом Match) using System; using System. Text.RegularExpressions; public class Test public static void MainO 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].ToStringO ); m = m.NextMatchO; Console.WriteLine( Итого: $ + total ); Результат работы программы: Салат - $4, борщ - $3, одеколон - $10. Итого: $17 При первом обращении к методу Match возвращается первый фрагмент строки, совпавший с регулярным выражением pattern. В классе Match определено свойство Groups, возвращающее коллекцию фрагментов, совпавших с подвыражениями в круглых скобках. Нулевой элемент коллекции содержит весь фрагмент, первый элемент - фрагмент, совпавший с подвыражением в первых скобках, второй элемент - фрагмент, совпавший с подвыражением во вторых скобках, и т. д. Если при определении выражения задать фрагментам имена, как это было 362 Глава 15. Дополнительные средства С# сделано в предыдущем листинге, можно будет обратиться к ним по этим именам, например; string pattern - @ (?name\w+) - \$(?price\d + )C.,] ; total += int.ParseC m.Groups[ price ].ToString() ); ПРИМЕЧАНИ Е- Метод NextMatch класса Match продолжает поиск в строке с того места, на котором закончился предыдущий поиск. Метод Matches класса Regex возвращает объект класса MatchCollection - коллекцию всех фрагментов заданной строки, совпавших с образцом. Рассмотрим теперь пример применения метода Split класса Regex. Этот метод разбивает заданную строку на фрагменты в соответствии с разделителями, заданными с помощью регулярного выражения, и возвращает эти фрагменты в массиве строк. В листинге 15.5 строка из листинга 15.4 разбивается на отдельные слова. Листинг 15.5. Разбиение строки на слова (методом Split) using System; usi ng System.Col 1ecti ons.Generi с; using System.Text.RegularExpressions; public class Test { public static void MainO string text = Салат - $4, борщ -$3. одеколон - $10. ; string pattern = [ - ..] + ; Regex r = new Regex( pattern ); List<string> words = new List<string>( r.SplitC text ) ); foreach ( string word in words ) Console.WriteLineC word ); i } . . . Результат работы программы: Салат $4 борщ одеколон Метод Repl асе класса Regex позволяет выполнять замену фрагментов текста. Определено несколько перегруженных версий этого метода. Вот как выглядит пример простейшего применения метода в его статическом варианте, заменяющего все вхождения символа $ символами у. е.: string text = Салат - $4, борщ -$3, одеколон - $10. ; string textl = Regex.Replасе( text, @ \$ , y.e. );
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |