Урок 4. Использование метасимволовМетасимволы были введены в уроке 2, "Поиск отдельных символов". В этом уроке вы узнаете о дополнительных метасимволах, используемых для указания соответствия с определенными символами или типами символов. Символ \: новые встречи со старым знакомым
Перед глубоким погружением в мир метасимволов важно понять назначение символа
Метасимволы — символы, которые имеют специальное значение в регулярных выражениях. Точка . является метасимволом, который соответствует любому отдельному символу (как объяснялось в уроке 2, "Поиск отдельных символов"). Точно так же левая скобка (
Поскольку метасимволы имеют специальное значение в регулярных выражениях, эти символы не могут использоваться для нахождения соответствующих им литералов. Например, вы не можете использовать Текст var myArray = new Array(); ... if (myArray[0] == 0) { ... } Регулярное выражение myArray[0] Результат var myArray = new Array(); ... if (myArray[0] == 0) { ... }
В этом примере блок текста — фрагмент кода на JavaScript. Регулярное выражение — то, что вы, вероятно, использовали бы в текстовом редакторе. Подразумевается, что оно должно было бы соответствовать буквальному тексту
Как объяснялось в уроке 2, "Поиск отдельных символов", метасимволы можно защитить наклонной чертой влево. Поэтому Текст var myArray = new Array(); ... if (myArray[0] == 0) { ... } Регулярное выражение myArray\[0\] Результат
var myArray = new Array();
...
if (myArray[0] == 0) {
...
}
Поиск работал правильно.
Честно говоря, использовать в этом примере регулярное выражение было не особенно необходимо — проще было обойтись поиском буквального текста. Но вообразите, что нужно было бы найти не только myArray\[[0-9]\] ЗамечаниеЛюбой метасимвол, а не только упомянутые здесь, можно защитить предшествующей ему наклонной чертой влево. Замечание
Метасимволы, которые являются частью пары (например,
Наклонная черта влево Рассмотрим следующий простой пример. Текст — путь к файлу, в котором используются наклонные черты влево (так принято в DOS и Windows). Теперь вообразите, что этот путь нужно использовать в системе Linux или Unix, и потому вы должны определить местонахождение всех наклонных черт влево для того, чтобы заменить их на наклонные черты вправо: Текст \home\ben\sales\ Регулярное выражение \\ Результат \home\ben\sales\
Выражение Поиск пробельных символов
Вообще говоря, метасимволы относятся к двум категориям: те, которые используются для поиска текста (они соответствуют искомому тексту; к этому типу относится, например, точка Когда вы с помощью регулярного выражения выполняете поиск, часто необходимо найти совпадение с непечатаемыми пробельными символами, входящими в текст. Например, иногда нужно найти все символы табуляции, или все концы строк. Поскольку непосредственно ввести такой символ в регулярное выражение было бы весьма непросто, имеются специальные метасимволы, перечисленные в таблице 4.1. Таблица 4.1. Метасимволы, обозначающие пробельные символы
Следующий блок текста содержит ряд записей в формате с разделителями-запятыми (часто этот формат называется CSV). Перед обработкой записей из данных нужно удалить все пустые строки. Вот пример: Текст "101","Ben","Forta" "102","Jim","James" "103","Roberta","Robertson" "104","Bob","Bobson" Регулярное выражение \r\n\r\n Результат "101","Ben","Forta" "102","Jim","James" "103","Roberta","Robertson" "104","Bob","Bobson"
Выражение Замечание
В Windows в качестве маркера конца строки используется
Чаще всего используются метасимволы Замечание
Вы только что познакомились с двумя разновидностями метасимволов. Точка Поиск символов определенных типов
К настоящему времени вы знаете, как найти конкретный символ или любой символ (используя точку ЗамечаниеПеречисленные ниже классы являются основными, поддерживаемыми почти во всех реализациях регулярных выражений. Поиск цифр (и нецифровых символов)
Как вы уже знаете из урока 3, "Соответствие набору символов", Таблица 4.2. Метасимволы цифр
Чтобы продемонстрировать использование этих метасим волов, давайте повторно рассмотрим предыдущий пример: Текст var myArray = new Array(); ... if (myArray[0] == 0) { ... } Регулярное выражение myArray\[\d\] Результат
var myArray = new Array();
...
if (myArray[0] == 0) {
...
}
Выражение ЗамечаниеПочти всегда есть несколько способов определения любого регулярного выражения. Выбирайте тот синтаксис, который вам наиболее удобен. Замечание
Синтаксис регулярных выражений чувствителен к регистру. Метасимвол Поиск алфавитно-цифровых символов (и символов, не относящихся к алфавитно-цифровым)
Есть еще один часто используемый набор — все алфавитно-цифровые символы, т.е. символы от Следующий пример — выборка из базы данных, содержащей записи с американскими почтовыми индексами и канадскими почтовыми кодами: Текст 11213 А1С2ЕЗ 48075 48237 M1B4F2 90046 Н1Н2Н2 Регулярное выражение \w\d\w\d\w\d Результат 11213 А1С2Е3 48075 48237 M1B4F2 90046 Н1Н2Н2
Чтобы отыскать только канадские почтовые коды, шаблон содержит комбинацию метасимволов Таблица 4.3. Метасимволы для алфавитно-цифровых символов
В этом примере шаблон работал правильно. Но является ли он правильным? Подумайте об этом. Почему не были найдены американские почтовые индексы? Только ли потому, что они составлены исключительно из цифр, или есть еще некоторая другая причина? Я не собираюсь давать вам ответ на этот вопрос, потому что, — ну, в общем, шаблон работал правильно. Ключ к решению этого вопроса состоит в том, что правильно работающее регулярное выражение редко можно однозначно считать правильным или неправильным. Чаще всего степень строгости сопоставления с шаблоном должна соответствовать сложности шаблона. Поиск пробельных символов и символов, не относящихся к нимНаконец, рассмотрим класс пробельных символов. Вы уже знаете метасимволы для определенных пробельных символов. В табл. 4.4 перечислены сокращения для класса всех пробельных символов. Таблица 4.4. Метасимволы для класса всех пробельных символов
Замечание
Обратите внимание, что метасимвол возврата на один символ, Указание шестнадцатеричных и восьмеричных значенийХотя определять символ его восьмеричным или шестна-дцатеричным значением не рекомендуется, стоит отметить, что это в принципе возможно. Указание шестнадцатеричных значений
Чтобы указать шестнадцатеричное (т.е. по основанию Указание восьмеричных значений
Чтобы указать восьмеричное (т.е. по основанию Замечание
Во многих реализациях регулярных выражений допускается также спецификация управляющих символов с помощью Использование символьных классов POSIXУрок по метасимволам и сокращениям для различных наборов символов не был бы полным без упоминания о символьных классах POSIX (табл. 4.5). Они — еще одна форма сокращения, которое поддерживается многими (но не всеми) реализациями регулярных выражений. ЗамечаниеJavaScript не поддерживает символьные классы POSIX в регулярных выражениях. Таблица 4.5. Символьные классы POSIX
Синтаксис POSIX весьма отличается от синтаксиса ранее изученных метасимволов. Чтобы продемонстрировать использование классов POSIX, повторно рассмотрим пример из предыдущего урока. В примере используем регулярное выражение, чтобы найти RGB-значения в блоке HTML-кода: Текст <BODY BGCOLOR="#336633" TEXT="#FFFFFF" MARGINWIDTH="0" MARGINHEIGHT="0" TOPMARGIN="0" LEFTMARGIN="0"> Регулярное выражение #[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] Результат <BODY BGCOLOR="#336633" TEXT="#FFFFFF" MARGINWIDTH="0" MARGINHEIGHT="0" TOPMARGIN="0" LEFTMARGIN="0">
В шаблоне, использованном в предыдущем уроке, набор символов Замечание
Обратите внимание, что регулярное выражение, используемое в этом примере, начинается с ЗамечаниеВсе 12 классов POSIX, перечисленные здесь, поддерживаются в любой реализации, которая поддерживает POSIX. Однако могут быть тонкие отклонения от предыдущих описаний. РезюмеОпираясь на основные сведения о соответствии символов и наборов, приведенные в уроках 2, "Поиск отдельных символов", и 3, "Соответствие набору символов", в этом уроке мы ввели метасимволы, которые соответствуют определенным символам (таким как табуляция или перевод строки), наборам либо классам символов (таким как цифры или алфавитно-цифровые символы). Эти обозначения метасимволов и классов POSIX могут использоваться для упрощения шаблонов, построенных по правилам языка регулярных выражений. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||