|
Последняя модификация: 25.03.2015 г Страница загружена с адреса: http://webdesign.site3k.ru/docs/patern.html Подстановочные символы (файловые шаблоны) и регулярные выражения.Эта статья задумывалась для разьяснения подстановочных символов, могущих использоваться в файле .htaccess и SSI-директивах. Но вскоре я обнаружил что, во многих книгах и подборках сатей по различным языкам программирования и операционным системам подстановочные символы, файловые шаблоны и регулярные выражения не разъясняются, а, в лучшем случае, лишь упоминаются вскользь. Поэтому, решено было сделать статью более общей, собрав в нее информацию по нескольким языкам. С учетом того, что WEB-программисту приходиться работать сразу с несколькими языками, а подстановочные символы легко забыть или перепутать, как они употребляются в одном языке, а как в другом, перечисление подстановочных символов и регулярных выражений различных языков в одном файле мне кажется очень удобным. Вы можете читать файл целиком, и сравнивать разные реализации шаблонов, а можете сразу перейти по ссылке к конкретному разделу. Файловые шаблоны в DOSWindows-у, файловые шаблоны достались от DOS-а, где имели наиболее примитивный из всех, самых примитивных воплощений. Существовало 2 шаблона: * Любое количество символов (строка) или их отсутствие. ? Любой символ или его отсутствие. Например, команда C:\WINDOWS\Рабочий стол>dir a* Выдавала следующий результат:
То есть, все файлы, начинающиеся на «a». Файловые шаблоны в NDOSПонимая, что этих шаблонов слишком мало, автор всемирно известных Norton Utilities, Питер Нортон, чьим любимым занятием было усовершенствование DOS (постепенно эти вещи появлялись и у Микрософт: однажды они сделали Скандиск, однажды купили у Нортона усеченный дефрагментатор ), еще в 80-х годах ввел расширенную поддержку шаблонов в свой командный интерпретатор NDOS (Norton Disk Operation Sistem), который предложил в замен Command.com-а. Язык NDOS своими возможностями не уступал бейсику и входил в состав Нортоновских утилит до тех пор, пока не наступило господство Windows. С наступлением эпохи Windows, NDOS утратил значение, так как практически для всех задач, для которых раньше требовалась командная строка, были сделаны графические аналоги и уже никто не хотел помнить, как правильно писать, например, VSCRPUT. Кроме того, NDOS не поддерживал длинных имен, а Питер Нортон, к тому времени, ушел на покой, продав права на разработки и торговые марки корпорации Symantec, так что, продлевать жизнь NDOS-а было некому, а, возможно, и незачем. Но ветераны компьютерного фронта, возможно еще помнят, каким мощным был язык и какими были его файловые шаблоны. В NDOS, к стандартным звездочке и вопросительному знаку добавились наборы символов и их диапазоны, а так же, логические операторы. Подобный шаблон заключался в квадратные скобки в которых прописывались требуемые символы, либо диапазон (символ1 символ2). Для обозначения того что, символы, наоборот, не требуются, ставился восклицательный знак. Как в таком случае работала всем известная команда DIR? dir [acm]* выводит список файлов и каталогов, начинающихся либо на a, либо на c, либо на m. dir [a-c]* выводит список файлов и каталогов, начинающихся либо на a, либо на b, либо на c. dir [!c]* выводит список файлов и каталогов, НЕ начинающихся на c.
Заинтересовавшиеся NDOS могут скачать и сам NDOS, и русскоязычную документацию к нему в архивах со страницы NDOS (поскольку он утратил актуальность, я не распаковываю документацию на сайт).
Однако, не будем далеко отходить от темы. NDOS раздвинул границу шаблонов, возможно, заимствовав эту идею из Unix (в каком году она там появилась?). По крайней мере, в Unix, для командного интерпретатора Shell, используется тот же синтаксис. Файловые шаблоны командного интерпретатора ShellПоиск всех символов (метасимвол *) Метасимвол * осуществляет поиск любой строки символов, включая нулевую (пустую) строку. Вы можете использовать * для обозначения полного или частичного имени файла. Просто символ * ищет все имена файлов и справочников в текущем справочнике, за исключением тех, которые начинаются с точки. Символ * может представлять символы в любой части имени файла. Например, если вы знаете, что несколько файлов имеют одинаковые первые и последние буквы, то вы можете выдать запрос, основываясь на этом факте. Если в вашем справочнике находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE, FAST_LINE, то для отображения всех этих файлов используйте шаблон:
Поиск по одному символу (метасимвол ?) Метасимвол ? осуществляет поиск любого одного символа в имени файла за исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и хотите получить список глав до 9-ой главы. Если ваш справочник содержит следующие файлы:
то используйте шаблон с метасимволом ? для получения всех глав, которые начинаются со строки "Chapter" и заканчиваются одним символом:
Хотя метасимвол осуществляет поиск одного символа, вы можете использовать его для поиска более одного символа в имени файла. Например, вы получите перечень всех остальных глав в текущем справочнике, если используете следующий шаблон:
И, конечно, чтобы получить список всех глав в текущем справочнике, используйте метасимвол *:
Поиск одного набора (метасимвол []) Если вы хотите, чтобы shell нашел любой символ из перечисленных вами символов, то заключите эти символы в квадратные скобки. Предположим, ваш справочник содержит следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь в качестве части имени файла шаблоном [crf], то shell будет искать имена файлов, в которые входят либо буква "c", либо буква "r", либо буква "f" в указанной позиции. Поис по шаблону [crf]at даст следующий результат:
Символы, которые могут быть сгруппированы в скобки, называются классом символов. Скобки могут также использоваться для обозначения диапазона символов, цифр или букв. Предположим в вашем справочнике содержатся следующие файлы: chapter1, chapter2, chapter3, chapter4, chapter5, chapter6. Если вы укажете:
то shell найдет файлы c chapter1 по chapter5. Класс символов можно также указать с помощью диапазона букв. Если вы укажете [A-Z], то shell будет искать только большие буквы, если [a-z] - то малые буквы.
Используется ли в Shell символ отрицания, как в NDOS не знаю, не пробовал, а в документации не вижу. Приду на работу, попробую (если не забуду). Напишу, что получится. Регулярные выраженияРегулярные выражения это больше чем файловые шаблоны. Регулярные выражения, в отличие от файлового шаблона, могут использоваться не только для поиска файлов по маске (более того, с этой целью они могут использоваться непосредственно только в файлах конфигурации сервера, например, .htaccess), но и для анализа текста, для чего не применимы файловые шаблоны. Регулярные выражения интерпретатора awkПростейшим регулярным выражением является строка символов, обрамленная знаками "/". Например: /Asia/ Эта означает все записи, которые содержат подстроку Asia (например, запись, содержащая Asia как часть длинной строки, подобной Asian или Pan-Asiatic). Чтобы ограничить поиск следует использовать операторы ~(входит) и !~(не входит). ~/Asia/ ищет подстроку Asia, в то время как программа: !~/Asia/ ищет подстроку в которой не содержится Asia. В регулярном выражении могут использоваться метасимволы:
Например: /^.$/ просматривает записи для поиска записи, состоящей из одного символа. /[a-zA-Z]/ поиск любой английской буквы /^[0-9]+$/ Состоит только из цифр
В дополнение к распознаваемым метасимволам, awk распознает следующие последовательности языка программирования Си внутри регулярных выражений и строк: \b возврат \f перевод формата \n новая строка \r возврат каретки \t табуляция \ddd восьмиричное значение \" кавычки c любой метасимвол \c с Например, выражение /\t/ Означает поиск табуляции Предположим, что нужно найти строку символов, подобную ^[0-9]+$. Если строка "^[0-9]+$" используется как регулярное выражение, появляются дополнительные знаки "\", которые защищают регулярное выражение. Это связано с тем, что первый уровень знаков "\" удаляется при синтаксическом анализе строки. Первый уровень "\" перед символом возвращает его специальное значение в регулярном выражении, второй нужен, чтобы защитить его в строке. Например, нужно найти строки, содержащие "b" и следующий за ним знак "$". Регулярное выражение для этого шаблона: b\$ Чтобы создать строку для представления этого регулярного выражения, необходимо добавить еще один символ "\":
"b\\$" Следующие регулярные выражения попарно эквивалентны:
Регулярные выражения Perl (целиком совместимы с выражениями в .htaccess)
Perl помещает регулярные выражения (образцы, шаблоны) в слэши, т. е. в наклонные черточки, например, в виде /pattern/. Следующие регулярные выражения истинны если:
Регулярные используют выражения для того, чтобы упростить сравнение строк. Для того чтобы проверить, содержит ли строка заданный образец, скрипт может использовать регулярные выражения следующим образом: if ($str =~ /pattern/) В данном случае регулярные выражения принимают значение «истинно», если образец найден в строке ($str). Если строка по содержит образца, то выражение возвращает значение «ложно». Например, следующее выражение проверяет, содержит ли строка текст Web Programming: if ($str =~ /Web Programming/) Для того, чтобы проверить полное совпадение, выражение должно привязать сравнение к началу и концу строки. Например, следующее выражение имеет значением величину «истинно», если и только если переменная $str принимает одно из трех значений: «banana», «bananana») «banananana»: ($str =~ /^ba(na) {2,4}$/) Аналогичным образом, следующее выражение истинно тогда и только тогда, когда переменная $str содержит слово «the» и не является частью другого слова, такого как «their». ($str =~ /\bthe\b/) Регулярные выражения PHPРегулярные выражения лежат в основе всех современных технологий поиска по шаблону. Регулярное выражение представляет собой последовательность простых и служебных символов, описывающих искомый текст. Иногда регулярные выражения бывают простыми и понятными (например, слово dog), но часто в них присутствуют служебные символы, обладающие особым смыслом в синтаксисе регулярных выражений, например, <(?)>.*<\/.?>. В РНР существуют два семейства функций, каждое из которых относится к определенному типу регулярных выражений: в стиле POSIX или в стиле Perl. Каждый тип регулярных выражений обладает собственным синтаксисом. Синтаксис регулярных выражений (POSIX)Структура регулярных выражений POSIX чем-то напоминает структуру типичных математических выражений различные элементы (операторы) объединяются друг с другом и образуют более сложные выражения. Однако именно смысл объединения элементов делает регулярные выражения таким мощным и выразительным средством. Возможности не ограничиваются поиском литерального текста (например, конкретного слова или числа); вы можете провести поиск строк с разной семантикой, но похожим синтаксисом например, всех тегов HTML в файле. Простейшее регулярное выражение совпадает с одним литеральным символом например, выражение g совпадает в таких строках, как g, haggle и bag. Выражение, полученное при объединении нескольких литеральных символов, совпадает по тем же правилам например, последовательность gan совпадает в любой строке, содержащей эти символы (например, gang, organize или Reagan). Оператор | (вертикальная черта) проверяет совпадение одной из нескольких альтернатив. Например, регулярное выражение php | zend проверяет строку на наличие php или zend.
Квадратные скобки Квадратные скобки ([ ]) имеют особый смысл в контексте регулярных выражений они означают «любой символ из перечисленных в скобках». В отличие от регулярного выражения php, которое совпадает во всех строках, содержащих литеральный текст php, выражение [php] совпадает в любой строке, содержащей символы р или h. Квадратные скобки играют важную роль при работе с регулярными выражениями, поскольку в процессе поиска часто возникает задача поиска символов из заданного интервала. Ниже перечислены некоторые часто используемые интервалы: [0-9] совпадает с любой десятичной цифрой от 0 до 9; [a-z] совпадает с любым символом нижнего регистра от а до z; [A-Z] совпадает с любым символом верхнего регистра от А до Z; [a -Z] совпадает с любым символом нижнего или верхнего регистра от а до Z.
Конечно, перечисленные выше интервалы всего лишь демонстрируют общий принцип. Например, вы можете воспользоваться интервалом [0-3] для обозначения любой десятичной цифры от 0 до 3 или интервалом [b-v] для обозначения любого символа нижнего регистра от b до v. Короче говоря, интервалы определяются совершенно произвольно.
Именованные интервалы Именованные интервалы символов являются предопределенными интервалами, имеющими удобочитаемое английское название, заключенное в двоеточия и квадратные кавычки. [:alpha:] — буква ; [:digit:] — цифра ; [:alnum:] — буква или цифра ; [:space:] — пробельный символ ; [:blank:] — пробельный символ или символы с кодом 0 и 255; [:cnrtl:] — управляющий символ ; [:graph:] — символ псевдографики ; [:lower:] — символ нижнего регистра ; [:upper:] — символ верхнего регистра ; [:print:] — печатаемый символ ; [:punct:] — знак пунктуации ; [:xdigit:] — цифра или буква от A до Z . При применении, именованые интервалы должны заключаться в дополнительные кавычки: abc[[:alnum:]]+ // abc, затем одна или более буква или цифра. abc[[:alpha:][:punct]0] // abc, далее буква , знак пунктуации или 0. Выражение abc[:alnum:]+ Будет неправильным.
Квантификаторы Существует особый класс служебных символов, обозначающих количество повторений отдельного символа или конструкции, заключенной в квадратные скобки. Эти служебные символы (+, * и {...}) называются квантификаторами. Принцип их действия проще всего пояснить на примерах: р+ означает один или несколько символов р, стоящих подряд; р* означает ноль и более символов р, стоящих подряд; р? означает ноль или один символ р; р{2} означает два символа р, стоящих подряд; р{2,3} означает от двух до трех символов р, стоящих подряд; р{2,} означает два и более символов р, стоящих подряд.
Прочие служебные символы Служебные символы $ и ^ совпадают не с символами, а с определенными позициями в строке. Например, выражение р$ означает строку, которая завершается символом р, а выражение ^р строку, начинающуюся с символа р. Конструкция [^a-zA-Z] совпадает с любым символом, не входящим в указаные интервалы (a-z и A-Z). Служебный символ . (точка) означает «любой символ». Например, выражение р.р совпадает с символом р, за которым следует произвольный символ, после чего опять следует символ р. Объединение служебных символов приводит к появлению более сложных выражений. Рассмотрим несколько примеров: ^.{2}$ любая строка, содержащая ровно два символа; <b>(.*)</b> произвольная последовательность символов, заключенная между <Ь> и </Ь> (вероятно, тегами HTML для вывода жирного текста); p(hp)* символ р, за которым следует ноль и более экземпляров последовательности hp (например, phphphp). Иногда требуется найти служебные символы в строках вместо того, чтобы использовать их в описанном специальном контексте. Для этого служебные символы экранируются обратной косой чертой (\). Например, для поиска денежной суммы в долларах можно воспользоваться выражением \$[0-9]+, то есть «знак доллара, за которым следует одна или несколько десятичных цифр». Обратите внимание на обратную косую черту перед $. Возможными совпадениями для этого регулярного выражения являются $42, $560 и $3.
Синтаксис регулярных выражений в стиле PerlPerl давно считается одним из самых лучших языков обработки текстов. Синтаксис Perl позволяет осуществлять поиск и замену даже для самых сложных шаблонов. Разработчики РHР сочли, что не стоит заново изобретать уже изобретенное, а лучше сделать знаменитый синтаксис регулярных выражений Perl доступным для пользователей РНР. Так появились функции для работы с регулярными выражениями в стиле Perl. Диалект регулярных выражений Perl не так уж сильно отличается от диалекта POSIX. В сущности, синтаксис регулярных выражений Perl является отдаленным потомком реализации POSIX, вследствие чего синтаксис POSIX почти совместим с функциями регулярных выражений стиля Perl. Оставшаяся часть этого раздела будет посвящена краткому знакомству с диалектом регулярных выражений Perl. Рассмотрим простой пример:
/food/
Обратите внимание: строка food заключена между двумя косыми чертами. Как и в стандарте POSIX, вы можете создавать более сложные шаблоны при помощи квантификаторов:
/fo+/
Этот шаблон совпадает с последовательностью fo, за которой могут следовать дополнительные символы о. Например, совпадения будут обнаружены в строках food, fool и fo4. Рассмотрим другой пример использования квантификатора:
/fo{2,4}/
Шаблон совпадает с символом f, за которым следуют от 2 до 4 экземпляров символа о. К числу потенциальных совпадений относятся строки fool , fooool и foosball . В регулярных выражениях Perl могут использоваться все квантификаторы, упомянутые в предыдущем разделе для регулярных выражений POSIX.
Метасимволы Одной из интересных особенностей Perl является использование метасимволов при поиске. Метасимвол [Следует отметить, что авторское толкование термина «метасимвол» противоречит не только всем традициям, по и официальной документации РНР. Примеч. перев.] представляет собой алфавитный символ с префиксом \ признаком особой интерпретации следующего символа. Например, метасимвол \d может использоваться при поиске денежных сумм:
/([\d]+)000/
Комбинация \d обозначает любую цифру. Конечно, в процессе поиска часто возникает задача идентификации алфавитно-цифровых символов, поэтому в Perl для них был определен метасимвол \w:
/<([\w]+)>/
Этот шаблон совпадает с конструкциями, заключенными в угловые скобки, например, тёгами HTML. Кстати, метасимвол \W имеет прямо противоположный смысл и используется для идентификации символов, не являющихся алфавитно-цифровыми. Еще один полезный метасимвол, \b, совпадает с границами слов:
/sa\b/
Поскольку метасимвол границы слова расположен справа от текста, этот шаблон совпадет в строках salsa и lisa, но не в строке sand. Противоположный метасимвол, \В, совпадает с чем угодно, кроме границы слова:
/sa\B/
Шаблон совпадает в таких строках, как sand и Sally, но не совпадает в строке salsa.
Модификаторы Модификаторы заметно упрощают работу с регулярными выражениями. Впрочем, модификаторов много, и в таблице приведены лишь наиболее интересные из них. Модификаторы перечисляются сразу же после регулярного выражения например, /string/i.
Регулярные выражения в JavaScriptПатэрн регулярного выражения состоит из простых символов, например, /abc/, или из комбинаций простых и специальных символов, как /ab*c/ или /Chapter (\d+)\.\d*/. В последнем примере имеются скобки, которые использованы как запоминающее устройство. Совпадение, сделанное этой частью патэрна, запоминается для последующего использования. Использование простых патэрнов Простые патэрны состоят из символов, для которых ищется прямое совпадение. Например, патэрн /abc/ совпадает с комбинацией символов в строке только тогда, когда символы 'abc' появляются вместе и в указанном порядке. Такое совпадение будет найдено в строках "Hi, do you know your abc's?" и "The latest airplane designs evolved from slabcraft." В обоих случаях имеется совпадение с подстрокой 'abc'. В строке "Grab crab" совпадения нет, потому что она не содержит подстроки 'abc'. Использование специальных символов Если при поиске требуется выполнить нечто большее, чем простое совпадение, например, найти один или более символов b или найти пробелы, патэрн должен содержать специальные символы. Например, патэрн /ab*c/ совпадает с любой комбинацией символов, в которой после одиночного 'a' следуют ноль или более 'b' (* означает 0 или более вхождений предыдущего символа) и символ 'c'. В строке "cbbabbbbcdebc" этот патэрн совпадает с подстрокой 'abbbbc'. В таблице дан полный список - описание специальных символов, которые могут использоваться в регулярных выражениях.
|