Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 64
Текст из файла (страница 64)
Ясггпд, большинство объектов, созданных из классов регулярных выражений, являются неизменяемыми. Главной "рабочей лошадкой" всей системы регулярных выражений является класс Еедех, находящийся в пространстве имен Яувгеш. Техг. Еедц1агЕхргеввсопв. Одним из наиболее распространенных способов его применения является создание экземпляра Еедех для представления регулярного выражения посредством передачи его конструктору строки шаблона поиска.
Затем этот экземпляр применяется к строке для поиска возможных совпадений. Можно также определить, где именно в строке находятся последовательные вхождения искомого шаблона. Давайте сначала рассмотрим пример того, как выглядит базовый поиск с еедех, а потом обратимся к более полезным способам применения Еедех. цзгпд Яузгеш; цв1пд Яувгеш.тенг.кедц1агЕхргевв1опв; рцЬ11с с1авв ЕпггурогпС ( вгагтс чогб Маго( зггспд() агдв ) ( 1Г( агдв.сепОСЬ < 1 Сопво1е.ыгтгесспе( "Вы должны предоставить строку." гесцгп? ?/ Создать регулярное выражение для поиска шаблона 1Р-адреса вгг1пд раггегп = Я" )бСб?сб?1.
1С1б?1б? . 1®б?1С? . 1%о? Сб!"; Редея гедех = пен еесех( рассегп ); масел шассь = седея.масс)1( агав(О) ): нв11е( шагсп.зцссевв ) сопво1е.кгсгеь1пе( "1Р-адрес найден в позиции (О) со " "значением (1)", завес.1пбех, шагов.уа1це загс)1 = шагсп.кехСМагсв()? ) ) Работа со строками 241 Код в этом примере производит поиск 1Р-адреса в строке, переданной в виде параметра командной строки. Поиск довольно топорный, но дальше он будет усовершенствован. Регулярные выражения могут состоять из литеральных символов.
которые нужно найти, а также управляющих символов, имеющих специальное назначение. Для защиты символов в регулярном выражении применяется хорошо знакомый метод обратного слэша. В данном примере 1с) означает десятичную цифру. Символы, снабженные суффиксом — знаком вопроса (7), означают одно или более вхождений предыдущего шаблонного символа регулярного выражения.
Обратите внимание на защищенные слэшем точки. Дело в том, что точка сама по себе в регулярном выражении имеет определеняый смысл. Незащищенная точка соответствует любому одиночному символу в позиции, где она находится. При объявлении регулярных выражений намного проще применять синтаксис дословных (тегЬайше) строк; это позволяет избежать чрезмерного . использования обратных олешей.
Если запустить код из предыдущего примера, передав ему в командной строке аргумент в кавычках: "Вот такой 1Р-адрес:123.123.1.123" то вывод будет выглядеть следующим образом: 1Р-адрес найден в позиции 19 со значением 123.123.1.123 В предыдущем примере создается новый экземпляр Редел по имени печек и затем с помощью метода Мат сЬ применяется шаблон к заданной строке. Результат соответствия сохраняется в переменной птатсЬ. Эта переменная содержит первое вхождение шаблона в строку.
Для определения, найдено ли соответствие регулярному выражению в строке, используется свойство Мат сЬ. Вцс се за. Далее следует код, получающий дополнительную информацию о найденном вхождении с помощью свойств Тпс)ех и )та1це. И, наконец, вызовом метода массь.
мехсмассЬ осуществляется переход к следующему соответствию в строке. и так до тех пор, пока не будут перебраны все вхождения шаблона в строке. В качестве альтернативы вместо вызова Маг сЬ. ХехСМатсЬ в цикле можно вызвать метод Ве9ех.максЬез для получения коллекции МаксЬСо11есг1оп, которая даст все вхождения сразу, поэтому перебирать их по одному не понадобится. Во всех примерах применения Ве9ех в настоящей главе вызываются методы экземпляра Ведах. У многих из таких методов.
например, МаксЬ и Еер1асе, также имеются статические версии, для которых предварительное создание экземпляра Верех не требуется, а нужно просто передать шаблон регулярного выражения при вызове метода. Поиск и группирование Если посмотреть на предыдущий пример, то все, что в нем происходит — это поиск по шаблону групп из десятичных цифр, разделенных точками, причем каждая группа может содержать от одной до трех цифр.
Речь о том, что такой грубый поиск обнаружит также соответствие и с некорректным 1Р-адресом вроде 999. 888. 777. 666. Более совершенный поиск 1Р-адреса должен выглядеть следующим образом: паапа аузсеит цзтп9 Вузоеи.техт.аечц1агЕхргевзаопэт рцЬ11с с1азз ЕпогуРоапк зоаоас тот б Маьп) зегто91) агоз ) 1 111 агчз.ьеп9СЬ < 1 ) ! сопзо1е.хгасеьше( "Вы должны предоставить строку." гесцгпт 242 Глава 8 О Создать регулярное выражение лля поиска шаблона 1Р-адреса. ввг1пд раесегп = 6" ( [ОЦ ? ьсПб? )2 [0-4) ьб) 25 [0-5] ) ь . " + 6" ([ОЦ?Я~с)? (2[0-4] Щ25 [0-5]) ~." + 6" ( [ОЦ?~с(~с(? ) 2 [0-4] ~с((25 [0-5] ) ~." + 6" ( [ОЦ? ~б~б? [2 [0-4] ~б) 25 [0-5] ) "; Яесех геоех = пен Ееоех( рассегп ); Масок шагов = геоех.нагой( агсз[0) нП11е( шассп.зцссезв ) Сопзо1е.кггсеьгпе( "1Р-алрес найден в позиции (О) со " + "значением (1)", шассп.1ппех, васса.за1це ); засол = шассп.йехГМассл О," Приведенное выше регулярное выражение содержит четыре группы одного и того же поискового шаблона [01]? Ысс)? ) 2 [0-4) '1с) ) 25 [ 0-5], разделенные точками, которые, конечно же, защищены.
Кикдое из этих подвыражений соответствует числу от 0 до 255 з. Такое регулярное выражение для поиска 1Р-адреса уже намного лучше. хотя все еще не идеально. Однако с небольшой тонкой настройкой его можно использовать для верификации 1р-адресов, переданных в строке. Таким образом, регулярные выражения можно применять для эффективной верификации пользовательского ввода, гарантируя, что он будет соответствовать определенной форме.
Например, существующий веб-сервер может ожидать ввода телефонных номеров США в формате (ххх) ххх-хххх. Регулярные выражения позволяют легко проверять корректность ввода номеров пользователями. Возможно, вы заметили, что в предыдущем примере в выражение поиска 1Р-адресов были добавлены скобки. Скобки используются для определения групп, формирующих подвыражения внутри общего регулярного выражения. []?уппы также могут содержать в себе другие группы. Таким образом, шаблон регулярного выражения, описывающий 1Р- адрес в предыдущем примере, формирует группу для каждой части 1Р-адреса.
К каждой индивидуальной группе внутри соответствия можно обращаться отдельно. Рассмотрим модифицированную версию того же самого примера: цз1пЧ Яузсезы цз1пд Яузсеш.техс.вечц1агЕхргезз1опз( рц)з11с с1азв ЕпсгуРогпс ( зсасьс чогб Мага( всг1пд[] агав ) ( 15( агЧв.ьепдсп < 1 ) сопзо1е.ыг1ге11пе( "вы должны предоставить строку." ) гегцгп; ) /I Создать регулярное выражение для поиска шаблона 1р-аЛРеса. всг1пд рассегп = 6" ( [ОЦ?101б? ) 2 [0-4) 1б) 25 [0-5] ) 1." + 6" ( [01)?1010? ) 2 [0-4] 10(25 [0-5) ) 1." + 6" ( [01)?1Фб? (2 [0-4) 10(25 [0-5] ) 1." + 6" ( [01]?1010? ) 2 [0-4) 10) 25 [0-5] ) "1 вечах гедех пен вечах( рагсегп )( Масса лассо гадах.насев( агдз[0) ); Подробный равбор специфики работы данного регулярного выражения выходит за рамки настоюцей книги.
В случае возникновения вопросов обращайтесь к одному из множества печатных или онлайновых руководств по регулярным выражениям, Работа со строками 243 нд[1е( шаксь.зцссезз ) ( Сопзо1е.нг1геЬ[пе( "1Р-адрес найден з позиции (О) со " "значением (1)", шаксь.1пс(ех, шакти.уа1пе )т Сопзо1е.нхасеьапе( "Группы:" ) т Вохеась( пхоцр д ап шаесь.пхосрз ) ( Сопзо1е.нх1севапе( "тх(0) в позиции (1)", д. да1це, д.тпк)ех ) т шапса = шаксп.нехгнагси О Для каждого соответствии добавлен цикл, выполнятощий итерацию по всем индивидуальным группам внутри соответствия. Как и можно было ожидать, в коллекции будет как минимум четыре группы, по одной для каждой части 1Р-адреса. Фактически, есть еще и пятый элемент группы — все совпадение.
Таким образом, одна из групп внутри коллекции групп, возвращенных масс)т. Сгоцрз, всегда будет содержать само полное соответствие. Если запустить приведенный выше код со следующей строкой: "Вот такой 1Р-адрес:123.123.1.123" то результат будет таким: 1Р-адрес найден в позиции 19 со значением 123.123.1.123 Группы: 123.123.1.123 з позиции 19 123 з позиции 19 123 з позиции 23 1 в позиции 27 123 в позиции 29 []7Уппы предоставляют блестящую возможность указать части заданной входной строки. Например, в некоторый момент, выполняя верификацию формата польаовательского ввода телефонного номера, можно также захватить область — группу кода междугородней связи — для последующего использования.












