Программирование >>  Обработка исключительных ситуаций 

1 ... 116 117 118 [ 119 ] 120 121 122 ... 142


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. );



1 ... 116 117 118 [ 119 ] 120 121 122 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика