Стандарт POSIX различает базовые и расширенные регулярные выражения. Регулярное выражение по сути, представляет собой набор правил для описания шаблонов. Сами правила записываются в виде последовательности обычных символов и метасимволов, которая затем в качестве образца используется для поиска текста.
Метасимволы - это символы, имеющие в регулярном выражении специальное значение:
Символы ".", [, \ имеют специальное значение, если не входят в состав выражения, заключенного в квадратные скобки [...]
Символ * имеет специальное значение, если он не входит в состав выражения в квадратных скобках, не является первым символом регулярного выражения и не является первым символам, следующим за парой символов \(
Символ ^ имеет специальное значение, если является первым символом регулярного выражения или первым символом выражения, заключенного в квадратные скобки
Символ $ имеет специальное значение, если является последним символом регулярного выражения
Любой символ, используемый в качестве ограничителя регулярного выражения, имеет специальное значение для данного регулярного выражения. Некоторые утилиты, использующие регулярные выражения, требуют их заключения между двумя символами-ограничителями, в качестве которых обычно используют символы / (напр. /regexp/). Вместо символов / может быть использована другая комбинация символов, например ?regexp? 'regexp' "regexp"
Символу "." соответствует любой одиночный символ, кроме символа новой строки.
Символ \ используется в качестве префикса для отмены специального значения следующего за ним метасимвола.
Конструкция, заключенная в квадратные скобки, имеет внутри регулярного выражения специальное значение. Конструкция[list] соответствует любой одиночный символ из списка list, который является последовательностью символов. Метасимволы . [ \ * внутри квадратных скобок теряют свое специальное значение. Два символа, разделенных символом - задают диапазон символов, например выражению [a-z] соответствует любой одиночный символ от a до z. Если требуется указать символ ], он должен быть первым в
списке list. Если требуется указать символ ^, он не должен быть первым в списке list. Если первым символом в скобках является символ ^, регулярному выражению соответствует любой одиночный символ, кроме, символов, перечисленных в скобках. ([^0-9] соответствует любой одиночный символ, кроме цифры и символа новой строки.
Последовательности символов [. [= [: внутри квадратных скобок имеют специальное значение. Последовательность символов, заключенная между ограничителями [. ... .] внутри квадратных скобок обозначают единый элемент, например, выражение [[.abc.]]
представляет один элемент abc, а выражение abc - последовательность элементов a, b и с. Регулярному выражению вида [[:class:]] соответствует любой одиночный символ, принадлежащий классу символов с именем class. Определены следующие стандартные классы символов:
Код:
[:alnum:] - все буквы и цифры
[:alpha:] - все буквы
[:blank:] - все горизонтальные пробельные символы (пробел, горизонтальная табуляция, возврат каретки)
[:cntrl:] - все управляющие символы
[:digit:] - все цифры
[:graph:] - все печатаемые символы, кроме пробела
[:lower:] - все строчные буквы (нижний регистр)
[:print:] - все печатаемые символы, включая пробел
[:punct:] - все знаки препинания
[:space:] - все горизонтальные и вертикальные пробельные символы (пробел, горизонтальная табуляция, возврат каретки, символ новой строки, вертикальная табуляция, перевод страницы)
[:upper:] - все прописные буквы (верхний регистр)
[:xdigit:] - все шестнадцатиричные цифры
Регулярному выражению вида [[=CHAR=]] соответствует любой одиночный символ, принадлежащий к тому же классу символов, что и символ CHAR.
Привязки. Для указания местоположения текста в пределах строки в составе регулярного выражения используются метасимволы ^ и $.
Метасимвол ^ обозначает начало строки, если является первым символом регулярного выражения, например, регулярному выражению ^[0-9] удовлетворяет любая строка, начинающаяся с цифры.
Метасимвол $ обозначает конец строки, если является последним символом регулярного выражения, например, регулярному выражению string$ удовлетворяет любая строка, завершающаяся словом string.
Построение сложных регулярных выражений.
Простейшим регулярным выражением является одиночный символ. При помощи конструкции в квадратных скобках можно задать образец, которому также соответствует одиночный символ. Для задания образцов, которым соответствуют последовательности символов существуют правила:
1. Конкатенация (объединение) двух регулярных выражений является регулярным выражением, например, регулярному выражению [a-z][0-9] соответствует любая последовательность, состоящая из строчной буквы латинского алфавита и следующей за ней цифры.
2. Если RE - регулярное выражение, которому соответствует одиночный символ, то конструкция RE* является регулярным выражением, которому соответствует повторение этого символа нуль или более раз, например a*b соответствует любая последовательность из нуля и более символов a, за которыми следует символ b: b, ab, aab и т.д.
3. Внутри регулярного выражения можно выделить подвыражение RE, заключив его между ограничителями \( и \) : \(RE\). Такая конструкция эквивалентна просто регулярному выражению RE. Разница заключается в том, что найденные фрагменты текста, соответствующие регулярному выражению RE, запоминаются в переменных \1, \2, ...\9, на которые можно сослаться в самом регулярном выражении. Переменные
\1, \2, ...\9 называются обратными ссылками. Например, регулярному выражению \(.\)\(.\)\2\1 соответствуют все палиндромы из четырех букв: abba, baab и т.д.
4.Если RE - регулярное выражение, которому соответствует одиночный символ, то конструкции RE\{m\}, RE\{m,\}, RE\{m,n\} являются регулярными выражениями, которым соответствуют повторение этого символа соответственно ровно m раз, не менее m раз, и от m до n раз. Например регулярному выражению [A-Z]\{10\} соответствует любая последовательность из 10 прописных букв латинского алфавита.
Расширенное регулярное выражение. Представляет собой последовательность, состоящую из одной или нескольких записей, разделенных символом | .
Символ | обозначает логическую операцию ИЛИ: регулярное выражение regexp1 | regexp2 определяет цепочку символов, которая соответствует или образцу regexp1 или образцу regexp2. Каждая запись состоит из атомов, за которыми могут следовать повторители *, +, ?, {...}.
Атомом является:
- любой одиночный символ
- метасимвол ".", соответствующий любому одиночному символу, кроме символа новой строки - один из метасимволов "^ . [ $ ( ) | * + ? { \" с префиксом \, отменяющим
его специальное значение - представляет сам себя
- обычный символ с префиксом \, соответствующий самому себе без префикса \
- регулярное выражение в скобках (...)
Скобки используются для группирования регулярных выражений, например, регулярному выражению (ab)* соответствует любая последовательность, состоящая из нуля и более пар символов ab. В расширенном регулярном выражении скобки могут также использоваться для выделения подвыражений вместо более сложной конструкции \(...\), используемой в базовом регулярном выражении. Если RE является атомом, то:
RE* - задает регулярное выражение, состоящее из нуля и более повторений RE
RE+ - задает регулярное выражение, состоящее из одного и более повторений RE
RE? - задает регулярное выражение, состоящее из нуля или одного повторений RE
RE{m} - задает регулярное выражение, состоящее ровно из m повторений RE
RE{m,} - задает регулярное выражение, состоящее из m и более повторений RE
RE{m,n} - задает регулярное выражение, состоящее минимум из m, максимум- из n повторений RE
Операции, применяемые к элементам расширенного регулярного выражения, в порядке убывания их приоритета располагаются следующим образом:
[ ]
* + ?
^ $
|
Примеры регулярных выражений:
^$ - пустая строка
.* - любая, в том числе пустая последовательность символов, не содержащая символ новой строки
^word - цепочка word в начале строки
[0-9] - одна цифра
[^0-9] - одна не цифра
[0-9]\{m,\} - цепочка из m и более цифр
abc|def - в расширенном регулярном выражении задает либо цепочку abc, либо def
.+ - в расширенном регулярном выражении задает любую непустую последовательность символов, не содержащую символ новой строки
[a-z]? - в расширенном регулярном выражении задает не более одного символа из а-z
\([a-zA-Z]\)\([a-zA-Z]\)\2\1 - цепочка из четырех букв, которая одинаково читается слева направо и справо налево (полиндромы)
Некоторые символы регулярного выражения имеют специальное значение для оболочки, поэтому в командной строке grep рекомендуется заключать шаблон expression в кавычки, чтобы исключить интерпретацию этих символов самим интерпретатором.
--------------------------
Еще примеры с grep.
Код:
grep bash$ /etc/passwd
Из файла /etc/passwd вывести записи, относящиеся к пользователям, использующих по умолчанию в качестве интерпретатора bash
Код:
grep sam /etc/passwd
сведения о пользователе sam
работает ли в системе пользователь sam
выполняется ли в системе процесс с именем httpd (иногда помогает найти путь к httpd.conf)