Анимация
JavaScript
|
Главная Библионтека /fredXb/; # соответствует слову fred, но не Frederick /\bmo/; # соответствует словам moe и mole, но не Elmo /\bFred\b/; # соответствует слову Fred, но не Frederick или alFred /\Ь\+\Ь/; # соответствует "х+у", но не "++" или " + " /abc/bdef/; # никогда не дает совпадения(границы там быть не может) Аналогичным образом \в требует, чтобы в указанной точке границы слова не было. Например: /\bFred\B/; # соответствует "Frederick", но не "Fred Flintstone" Две другие фиксирующие точки требуют, чтобы определенная часть образца стояла рядом с концом строки. Символ обозначает начало строки, если стоит в месте, где сопоставление с началом строки имеет смысл. Например, "а соответствует символу а в том и только в том случае, если а - первый символ в строке, а" соответствует двум символам, а и стоящим в любом месте строки. Другими словами, символ утратил свое специальное значение. Если вы хотите, чтобы он имел буквальный смысл и в начале строки, поставьте перед ним обратную косую черту. Символ $, как и , фиксирует образец, но не по началу, а по концу строки. Другими словами, с$ соответствует символу с только в том случае, если он стоит в конце строки*. Знак доллара в любом другом месте образца, вероятно, будет интерпретироваться как представление скалярного значения, поэтому для того, чтобы использовать его в строке буквально, перед ним следует поставить обратную косую. Поддерживаются и другие фиксирующие точки, включая \А, \z и упреждающие фиксирующие точки, создаваемые с помощью комбинаций (?=...) и (?!...). Они подробно описаны в главе 2 книги Programming Perl и на man-странице perlre(l). Приоритет Что произойдет, если объединить а Ь*? Что будет отыскиваться - любое количество символов а или b или один символ а и любое количество Ь? Групповые и фиксированные образцы, как и операции, имеют приоритет. Приоритет образцов (от высшего к низшему) приведен в таблице 7.2. Таблица 7.2. Приоритет групповых регулярных выражений**
* Или прямо перед символом новой строки в конце строки. ** Некоторые из этих символов в нашей книге не описываются См. книгу Programming Perl или man-страницу perlreii(\). Согласно этой таблице, специальный символ * имеет более высокий приоритет, чем . В силу этого /аЬ*/ интерпретируется как один символ а или любое число символов Ь. Что, если нам понадобится другое - например, "любое число символов а или Ь"? В этом случае нужно просто использовать пару круглых скобок. В нашем примере в скобки нужно заключить ту часть выражения, к которой должна относиться *, т.е. (аЬ)*. Если вы хотите подчеркнуть, какое выражение вычисляется первым, можно дать избыточные круглые скобки: а (Ь*). Изменение приоритета с помощью круглых скобок одновременно активизирует режим запоминания для данного образца, как мы рассказывали выше. То есть эти круглые скобки учитываются, когда вы определяете, соответствует ли какой-то элемент \2, \3 и т.д. Если вы хотите использовать круглые скобки без включения режима запоминания, применяйте форму (?:...), а не (...). Она тоже позволяет указывать множители, но не изменяет значение счетчика подлежащих запоминанию лексем, используя, например, переменную $4 и т.п. Например, /(?: Fred wilma) Flintstone/ ничего не записывает в переменную $ 1; здесь просто предполагается группирование. Вот еще несколько примеров регулярных выражений и действия круглых скобок: аЬс* # соответствует аЬ, abc, abcc, abccc, abcccc, и т.д. (abc)* # соответствует "", ab, abc, abcabc, abcabcabc, и т.д. "xly # соответствует x в начале строки или у в любом месте "(xly) # соответствует х или у в начале строки а I be Id # либо а, либо be, либо d (ab)(cd) # ас, ad, be или bd (song I blue)bird # songbird или bluebird Еще об операции сопоставления Мы уже рассматривали простейшие варианты использования операции сопоставления (регулярного выражения, заключенного между косыми). Теперь давайте изучим способы, которыми можно заставить эту операцию делать нечто иное. Выбор другого объекта для сопоставлетм (операция =-) Обычно строка, которую нужно сопоставить с образцом, не находится в переменной $ , и помещать ее туда довольно утомительно. (Может быть, в переменной $ уже хранится значение, которое вам не хочется терять.) Нигего страшного - здесь нам поможет операция =~. С ее помощью вы можете назначить для проведения операции сопоставления строку, хранящуюся в переменной, отличной от $ . Эта переменная указывается справа от знака операции. Выглядит это так; За = "hello world"; Sa =~ /•he/; # истина $а =~ /(.)\1/; # тоже истина (соответствует двум 1) if (Sa =~ / ( . )\1/) ( # истина, поэтому проводятся дальнейшие операции Справа от знака операции =~ может стоять любое выражение, которое дает в результате некоторое скалярное строковое значение. Например, <stdin> при использовании в скалярном контексте дает скалярное строковое значение, поэтому, объединив эту операцию с операцией =~ и операцией сопоставления с регулярным выражением, мы получим компактную программу проверки входных данных; print "any last request? "; if (<STDIN> =~ /[yY]/) { # начинаются ли входные данные с буквы у? print "And ]ust what might that request be? "; # и чтобы это мог быть за запрос? <STDIN>; # получить строку со стандартного ввода print "Sorry, Im unable to do that.Xn"; # прошу прощения, но я не могу этого сделать В данном случае при помощи <stdin> берется очередная строка со стандартного ввода, которая затем сразу же используется как строка, сопоставляемая с образцом [уУ]. Отметим, что мы не сохраняли входные данные в переменной, поэтому если мы захотим сопоставить эти данные с другим образцом или же вывести их в сообщении об ошибке, то у нас ничего не выйдет. Тем не менее эта форма часто оказывается удобной. Игнорирование регистра В предыдущем примере мы указывали образец [уУ] для обозначения строчной и прописной буквы у. Если речь идет об очень коротких строках, например, у или fred, то данный способ обозначения достаточно удобен, скажем, [fF] [rR] [еЕ] [dD]. А что делать, если сопоставляемая строка - это слово procedure в нижнем или верхнем регистре? В некоторых версиях grep флаг -i означает "игнорировать регистр". В Perl тоже есть такая опция. Чтобы ею воспользоваться, нужно добавить строчную i к закрывающей косой черте, т.е. написать /образец/i. Такая запись говорит о том, что буквы образца будут соответствовать буквам строки в любом регистре. Например, чтобы найти слово procedure в любом регистре, стоящее в начале строки, запишите /procedure/i. Теперь наш предыдущий пример будет выглядеть так: print "any last request? "; if (<STDIN> =~ /-y/i) ( # начинаются ли входные данные с буквы у? # да выполнить какие-то операции 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 |