Анимация
JavaScript
|
Главная Библионтека Как и в grep, такая запись обозначает последовательность, содержащую символ а, ни одного или более символов Ь и символ с. Другие варианты сопоставления с образцом мы рассмотрим в разделе "Еще об операции сопоставления" после того, как поговорим обо всех видах регулярных выражений. Еще одна простая операция, в которой используются регулярные выражения, - операция замены, посредством которой часть строки, соответствующая регулярному выражению, заменяется другой строкой. Операция замены похожа на команду s UNIX-утилиты sed: она состоит из буквы s, косой черты, регулярного выражения, еще одной косой, заменяющей строки и третьей косой черты: s/ab*c/def/; Переменная (в данном случае $ ) сопоставляется с регулярным выражением (аЬ*с). Если сопоставление оказалось успешным, то соответствующая часть строки отбрасывается и заменяется строкой (def). Если сопоставление неудачно, ничего не происходит. Позже, в разделе "Операция замены", мы рассмотрим множество опций операции замены. Образцы Регулярное выражение - это образец. Одни части образца обозначают отдельные символы. Другие части соответствуют группам символов. Сначала мы рассмотрим образцы, соответствующие одному символу, а затем образцы, при помощи которых в регулярном выражении обозначается группа символов. Образцы, обозначающие один символ Самый простой и самый распространенный символ, встречающийся в регулярных выражениях, - это одиночный символ, соответствующий самому себе. Другими словами, наличие буквы а в регулярном выражении требует налрршя соответствующей буквы а в строке. Следующий из самых известных символов сопоставления - точка ("."). Точка обозначает любой одиночный символ, кроме символа новой строки (\п). Например, образцу /а . / соответствует любая двухбуквенная последовательность, которая начинается с буквы а и не является последовательностью "а\п". Каасс символов сопоставления задается списком символов, заключенных в квадратные скобки. Чтобы строка считалась совпавшей с образцом, в соответствующей ее части должен присутствовать один и только один из этих символов. Например, образцу / [abode] соответствует строка, содержащая любую из первых пяти строчных букв алфавита, тогда как образцу /[aeiouAEIOU] соответствует любая из первых пяти гласных, причем как строчных, так и прописных. Если вы хотите вставить в список правую квадратную скобку (]), поставьте перед ней обратную косую или же поставьте эту скобку на первое место в списке. Диапазоны символов (например, от а до z) можно приводить в сокращенной записи, указав конечные точки диапазона через дефис (-). Чтобы включить в список дефис как таковой, поставьте перед ним обратную косую или поместите его в конец. Вот еще несколько примеров: [0123456789] # обозначает любую цифру [0-9] # то же самое [0-9\-] # обозначает цифры 0-9 или знак минус [a-zO-9] # обозначает любую строчную букву или цифру [a-zA-Z0-9 ] # обозначает любую букву, цифру или знак подчеркивания Существует также такое понятие, как отрицание класса символов: оно обозначается знаком который ставится сразу же за левой скобкой. Такому классу символов соответствует любой символ, отсутствующий в этом списке. Например: [•0-9] # обозначает любой нецифровой символ [aeiouAEIOU] # обозначает любую негласную букву [\] # обозначает любой символ, кроме символа Для удобства пользователя некоторые распространенные классы символов определены заранее. Они представлены в таблице 7.1. Таблица 7.1. Предопределенные классы символов
Образцу \d соответствует одна цифра. Образцу \w формально соответствует один обычный символ, но на самом деле ему соответствует любой символ, который допустим в именах переменных Perl. Образцу \s соответствует один пробельный символ. К пробельным символам относятся йробел, возврат каретки (редко используемый в UNIX), символ табуляции, символы перехода на новую строку и на новую страницу. Варианты конструкций с использованием прописных букв соответствуют дополнениям (отрицаниям) этих классов. Так, \w обозначает один специальный символ, \s - один символ, который не является пробельным (т.е. является буквой, знаком препинания, управляющим символом и т.д.), а \D - один нецифровой символ. Приведенные выше конструкции можно использовать при задании других классов символов: [\da-fA-F] # соответствует одной шестнадцатеричной цифре Образцы, обозначающие группу символов Свою истинную силу регулярные выражения показывают, когда вам нужно сказать, например, "один и более из этих символов" или "до пяти из этих символов". Давайте посмотрим, как это делается. Последовательност ь Первый (и, вероятно, самый неочевидный) образец данного вида - последовательность. Например, образец abc соответствует букве а, за которой следует буква ь, за которой идет буква с. Вроде бы просто, но название этому виду образца все равно нужно дать, чтобы в дальнейшем знать, о чем идет речь. Множители Мы уже встречались со звездочкой (*) в роли образца, обозначающего группу символов. Звездочка обозначает ни одного или более экземпляров стоящего непосредственно перед ней символа (или класса символов). Есть еще два образца, работающих подобным образом: знак "плюс" (-f-), который обозначает один или более экземпляров стоящего непосредственно перед ним символа, и вопросительный знак (?), который обозначает ни одного или один экземпляр стоящего непосредственно перед ним символа. Например, регулярное выражение /fo+ba?r/ обозначает символ f, за которым следует один или более символов о, затем символ Ь, затем ни одного или один символ а и, наконец, символ г. Однако все описанные выше образцы (множители) характеризуются "прожорливостью". Например, если множителю может соответствовать 5-10 символов, то каждый раз он будет выбирать десятисимвольную строку. Например, $ = "fred хххххххххх barney"; s/x+/boom/; всегда заменяет словом boom все символы х (что в результате дает fred boom barney), а не только один или два, несмотря на то, что более короткий набор иксов соответствовал бы этому же регулярному выражению. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [ 34 ] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |