Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 65
Текст из файла (страница 65)
Организация подстрок соответствия в группы весьма удобна. Но что еще удобнее, так это возможность назначения группам имен. Взгляните на следующий модифицированный пример: цзапд Вузсеш; ца[пд Вузгеш.техт.аедп1агЕхргеззаопзк рць1[с с1азз епсгуРокпс ( зсасас чокб ма1п( зсгапд() агдз ) ( 11( агдз.ЬепдСП < 1 ) ( Сопзо1е.вгаоеьапе( "Вы должны предоставить строку." )т гесцгпт ) // Создать регулярное выражение для поиска шаблона 1Р-адреса.
захапд раааехп 9" (9<раха1>[01] Ртбтбт (2 [0-4] тс(25 [0-5] ) т." + 9" (9<раха2> [01] 2~0~67 (2 [0-4] ~б) 25 [0-5] ) ~." + 9" (9<рахеЗ>[01] Ртбтст) 2 [0-4] тб) 25 [0-5] ) 1." + 9" (9<рахе4> [ОЦ 2ММР) 2 [0-4] ~6(25 [0-5] ) "т Еедех гедех = пен Кедзи( рагаегп )К Макс)т шаксь гедех.Макси( агдз[О) )т 244 Глава 8 нП11е( васев.Яиссеяз ) Сопзо1е.кг1сеЬ[пе( "1Р-адрес найден з позиции (О) со " + "значением (1)", ваго)1.1пбех, васой.иа1ие ); Сопяо1е.кг1сеЬЬпе( "Группы:" ); Сопяо1е.нгаееьапе( м[СЧасеь 1: (0)", васс)с.6гоиря["раге1"] )) Сопео1е.игвсеЬЬпе( "1ЕЧасеь 2: (0)", васс)с.пгоире["рагс2"] ); Сопяо1е.нгхсеЬ1пе( "сеЧасеь 3: (О)", васо)с.пгоиря["раге3"] )) Сопзо1е.нгвсеьапе( "ссчасеь 4: (0)", тасс)с.пгоире["раге4"] )? вассз = вассп.иехгиагсП(); ) ) В этом варианте кода каждая часть захватывается в группу с некоторым именем.
и при отправке результата на консоль обращение к группе осуществляется по имени через индексатор в сгоирсо11есгуоп, который возвращен методом магсь.Сгоиря, принимающим строковый аргумент. Благодаря именованию групп, появилась возможность ссылаться на них внутри поиска. Например, при поиске точного повторения предыдущего соответствия можно обратиться к предыдущей группе с помощью того, что называется обратной ссылкой, включив ~)с<имя>, где имя — имя группы для обратной ссылки.
Например, рассмотрим следующий пример поиска ]р-адресов, у которых все части совпадают: из[по Яуягев? из[по Буягев.техс.кейя1агЕхргеяя[опя; риЬ11с с1аяя ЕпггуРо[пс ( ясаГЬс чоха Мако( ясг1п0[] агоя ) ( 11( агдя.ЬепдГП < 1 ) ( Сопяо1е.кгтсеЬ[пе( "Вы должны предостазить строку." ) гегигп? ) !/ Создать регулярное выражение для поиска шаблона 1Р-адреса. ягг1по рагсегп = 0"(?<Рагг1>[01)?10Ы?)2[0-4] 16)25[0-5])1." ь 0"'с)«раге1>с." + 6 м[)с<рагс1>с. " + 6"Чс<рагс1>") Веоех геоех = пеи Весах( рассегп ); Масел вассП = геях.Магов( агся(0) )1 нП11е( шасси.Биссеяя ) ( сопяо1е.хг1сеь1пе( "1Р†адр найден з позиции (О) со " ь "значением (1)", васса.1пбех, васек.иа1ие ); вассП = ааспб.кехсмассб()? ) ) ) Ниже показан результат запуска этого кода с параметром "Мой 1Р-адрес выглядит как 123.123.123.123ГС 1Р-адрес найден з позиции 26 со значением 123.123.123.123 Работа со строками 246 Замена текста с помощью ае(тех При обработке текста в Рег! без механизма регулярных выражений не обойтись.
Одним из огромных преимуществ Рег! являются возможности подстановки текста. Регулярные выражения в .]дЕТ предлагают аналогичные возможности через перегрузки метода Кедех. Рер1асе. Предположим, что во введенной пользователем строке необходимо найти 1Р-адрес и затем отобразить строку, причем из соображений безопасности заменить [Р-адрес маской ххх. ххх. ххх.
ххх. Ниже показано, как решить такую задачу: пя1пд Буясеш; пяапд Яуякеш.Техг.аедп1агЕхргеязаопя; рпЬ11с с1аяя ЕпггуРоапг ( ягаг1с чоаб Мято( ягггпд[] ягдя ) ( 11( ягдя.ьяпдСЬ < 1 ) ( Сопзо1е.нгатеьапе( "Вы должны предоставить строку." гегпгп; ) у/ Создать регулярное выражение лля поиска шаблона 1Р-адреса. яггтпд расгегп = 8" ( [01]?101б? (2 (0-4] 10(25 [0-5] ) 1." я 8" ( [01]?1%с)? (2 [0-4] 10(25 [0-5] ) 1." я 6" ( [01)?1Фс$? (2 [0-4] 10) 25 [0-5] ) 1." т а" ( [01)?Ы1с(? (2 [0-4] Тс((25 (0-5) ) "т Кедех гедех = пен Кедех( раггегп )т Сопяо1е.нгаге11пе( "Полученный ввод -> (О)", гедех.кер1ясе(агдз(0], "ххх.ххх.ххх.ххх") Теперь при следующем вводе: "Вот такой 1Р-адрес;123.123.1.123" вывод будет выглядеть так: Полученный ввод -> Вот такой 1Р-адрес:ххх.ххх.ххх.ххх Найденное соответствие внутри строки может потребоваться заменить чем-то таким.что зависит от найденного соответствия.
В предыдущем примере каждое вхождение просто заменяется статической строкой. Для того чтобы выполнять замену на основе экземпляра соответствия, можно создать экземпляр делегата магсьеча1пагог н передать его методу Кедех. Кер1асе, Затем при каждом обнаружении соответствия он будет вызывать экземпляр делегата МагсЬЕча1пагог, передавая ему найденное соответствие. Тогда делегат может создавать заменяющую строку на основе текущего соответствия. Делегат МагсЬЕча1пагог имеет следующую сигнатуру: РпЬ11с с)е1едясе яггапд Мяссьачя1иягог( Магов шагсЬ )т Предположим,что требуется поменять порядок индивидуальных частей 1Р-адреса. Для этого можно воспользоваться МагсЬЕчя1пасог в сочетании с Кедех.
Кер1асе, как показано в следующем примере: пз1пд Буягеап пяапд Вуясеш.Техст пя1пд Буясеш.техг.кедп1ягЕхргеяя1опяс рова!с с1яяя ЕпсгуРоапг ( 246 Глава 6 вгагас чо[б маап( зггапд[) агдз ) ( 11( агдв.ьепдГЬ < 1 ) ( Сопво1е.иг1се11пе( "Вы должны предоставить строку." ) гесигп? ) // Создать регулярное выражение для поиска шаблона 1Р-адреса. вегапд раегагп * 6" (?<раге1>[01]?)с14(? (2 [0-4] Щ 25 [0-5] ) ~. " + 6" (?<рагг2>[01]?Ч10? (г [0-4] Н(25 [0-5] ) ~." + 6" (?<рагез> [01]? ~б~б? (2 [0-4] Н(25 [0-5] ) 1.
" + 6" (?<рагсв>[01]? ~Фб? ) 2 [0-4] М(25 [0-5] ) "; Ведех гедех = пен Ведех( рассегп )? маесь шаесь «»гадах.маесь( агдв[0) )1 МассЬЕча1иагог еча1 е пе» МассЬЕча1иаеог( Епггуроапг. 1РВечегве ); Сопво1е.игаее11пе( гадах.Вер1асе(агдв[0), еча1) ); ) веас1с вег1пд 1РВечегве( МагсЬ шаесЬ ) Зег1пдви11бег вЬ пек Зсг1пдВи11дег()? вЬ.Аррепб( алесь.дгоирв["рагс4"] + "." ); вЬ.Аррепб( шагсь.дгоирв["рагЕЗ"] + "." ); вь.лррепб( шаесь.дгоирв["раге2"] + "." ); вь.лрреюк$( шаесь.дгоирв["раьс1") ); гееигп зЬ. Товгг(шд (); При каждом обнаружении соответствия вызывается делегат, определяющий необходимую строку для замены. Изменение порядка — не слишком сложная работа для того, что называется подстлановкой с помощью регулярного выражения. Если бы в примере, предшествующем рассматриваемому, было решено применить перегрузку еер1асе, не используюшую делегат МагсЬЕча1иагог, удалось бы получить тот же самый результат, поскольку гедех позволяет обращаться к переменным групп в строке замены.
Для ссылки на именованную группу используется синтаксис, показанный в следующем примере: ивапд Зувсеш; пз1пд Зузсеш.Техт; пзапд Бувсеш.техт.кеди1агЕхргеззаопз; рпь11с с1азв епсгу?о1пг ( вгасас чо10 Ма1п( всгапд[] агдз ) ( 11( агдв.ьепдгЬ < 1 ) ( сопзо1е.вгагеьапе( "Вы должны предоставить строку." )? гесигп? ) // Создать регулярное выражение для поиска шаблона 1Р-адреса. всгапд рагсегп = 6" (?<рагс1>[01]?1ЮО? (2 [0-4] 10(25 [0-5] ) 1." + 6" (?<Рагс?>[01]?1ЮО? (2 (0-4) 10(25 [0-5) ) 1." + 6" (? <РагГЗ> [01]?1ФО? (2 [0-4] 1С(25 [0-5) ) 1." + 6" (?<Рагсв> [01]?1010? (2 [0-4) 10) 25 (0-5) ) "1 Ведех гедех пек Ведех( рагсегп ); Магсп шагсп гедех.МагсЬ( агдв[0] ); зег1пд гер1асе к 6"6(рагеа).$(раггЗ).6(раге2).6(раге1)" + 6" (ЕЬе гечегве от 64] "; сопво1е.игасеьапе( гедех.кер1асе(агдз[0), гер1асе) )? Работа со строками 24т Для включения одной из именованных групп применяется синтаксис Я (ныл ), где иыя — имя группы.
Ссылка на полный текст соответствия осуществляется с помощью Я а. Доступны и другие строки подстановок. такие как Я ', которая обозначает часть входной строки, предшествующую найденному соответствию, и Я ', обозначающая весь текст после соответствия.
Все множество строк подстановок описано в документации МБР)т). Как и можно было ожидать, реализация регулярных выражений .)))ЕТ обеспечивает такие же богатые возможности сложных замен строк, как и в языке Рег1. Варианты создания аедех Одна из перегрузок конструкторов Еесех позволяет передавать различные варианты типа Ееоехбрт1опя при создании экземпляра еесех. Аналогично, такие методы кеоех, как мзтсь и кер1асе, также имеют статические перегрузки, принимающие флаги ЕеоехорТ1опя. В этом разделе будут показаны некоторые наиболее часто используемые варианты, а полное описание всех вариантов и поведения Ееоехбрт топя можно найти в документации МБР)Ы.















