Выражение — это строка символов. Символы, которые имеют особое назначение, называются метасимволами. Так, например, кавычки могут выделять прямую речь, т.е. быть метасимволами для строки, заключенной в эти кавычки. Регулярные выражения — это набор символов и/или метасимволов, которые наделены особыми свойствами. [47]
Основное назначение регулярных выражений — это поиск текста по шаблону и работа со строками.
-
Звездочка — * — означает любое количество символов в строке, предшествующих «звездочке», в том числе и нулевое число символов.
Выражение «1133*» — означает 11 + один или более символов "3" + любые другие символы: 113, 1133, 113312, и так далее.
-
Точка — . — означает не менее одного любого символа, за исключением символа перевода строки (\n). [48]
Выражение «13.» будет означать 13 + по меньшей мере один любой символ (включая пробел): 1133, 11333, но не 13 (отсутствуют дополнительные символы).
-
Символ — ^ — означает начало строки, но иногда, в зависимости от контекста, означает отрицание в регулярных выражениях.
-
Знак доллара — $ — в конце регулярного выражения соответствует концу строки.
Выражение «^$» соответствует пустой строке.
Символы ^ и $ иногда еще называют якорями, поскольку они означают, или закрепляют, позицию в регулярных выражениях.
-
Квадратные скобки — […] — предназначены для задания подмножества символов. Квадратные скобки, внутри регулярного выражения, считаются одним символом, который может принимать значения, перечисленные внутри этих скобок..
Выражение «[xyz]» — соответствует одному из символов x, y или z.
Выражение «[c-n]» соответствует одному из символов в диапазоне от c до n, включительно.
Выражение «[B-Pk-y]» соответствует одному из символов в диапазоне от B до P или в диапазоне от k до y, включительно.
Выражение «[a-z0-9]» соответствует одному из символов латиницы в нижнем регистре или цифре.
Выражение «[^b-d]» соответствует любому символу, кроме символов из диапазона от b до d, включительно. В данном случае, метасимвол ^ означает отрицание.
Объединяя квадратные скобки в одну последовательность, можно задать шаблон искомого слова. Так, выражение «[Yy][Ee][Ss]» соответствует словам yes, Yes, YES, yEs и так далее. Выражение «[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]» определяет шаблон для поиска любого номера карточки социального страхования (для США).
-
Обратный слэш — \ — служит для экранирования специальных символов, это означает, что экранированные символы должны интерпретироваться буквально, т.е. как простые символы.
Комбинация «\$» указывает на то, что символ «$» трактуется как обычный символ, а не как признак конца строки в регулярных выражениях. Аналогично, комбинация «\\» соответствует простому символу «\».
-
Экранированные «угловые скобки» — \<…\> — отмечают границы слова.
Угловые скобки должны экранироваться, иначе они будут интерпретироваться как простые символы.
Выражение «\<the\>» соответствует слову «the», и не соответствует словам «them», «there», «other» и т.п.
-
bash$ cat textfile
-
This is line 1, of which there is only one instance.
-
This is the only instance of line 2.
-
This is line 3, another line.
-
This is line 4.
-
bash$ grep ‘the’ textfile
-
This is line 1, of which there is only one instance.
-
This is the only instance of line 2.
-
This is line 3, another line.
-
bash$ grep ‘\<the\>’ textfile
-
This is the only instance of line 2.
-
-
-
Знак вопроса — ? — означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз. В основном используется для поиска одиночных символов.
-
Знак «плюс» — + — указывает на то, что предыдущий символ или выражение встречается 1 или более раз. Играет ту же роль, что и символ «звездочка» (*), за исключением случая нулевого количества вхождений.
-
# GNU версии sed и awk допускают использование «+»,
-
# но его необходимо экранировать.
-
echo a111b | sed -ne ‘/a1\+b/p’
-
echo a111b | grep ‘a1\+b’
-
echo a111b | gawk ‘/a1+b/’
-
# Все три варианта эквивалентны.
-
# Спасибо S.C.
-
-
Экранированные «фигурные скобки» — \{ \} — задают число вхождений предыдущего выражения.
Экранирование фигурных скобок — обязательное условие, иначе они будут интерпретироваться как простые символы. Такой порядок использования, технически, не является частью основного набора правил построения регулярных выражений.
Выражение «[0-9]\{5\}» — в точности соответствует подстроке из пяти десятичных цифр (символов из диапазона от 0 до 9, включительно).
В «классической» (не совместимой с POSIX) версии awk, фигурные скобки не могут быть использованы. Однако, в gawk предусмотрен ключ --re-interval, который позволяет использовать (неэкранированные) фигурные скобки.
-
bash$ echo 2222 | gawk —re-interval ‘/2{3}/’
-
2222
-
Язык программирования Perl и некоторые версии egrep не требуют экранирования фигурных скобок.
-
-
Круглые скобки — ( ) — предназначены для выделения групп регулярных выражений. Они полезны при использовании с оператором «|« и при извлечении подстроки с помощью команды expr.
-
Вертикальная черта — | — выполняет роль логического оператора «ИЛИ» в регулярных выражениях и служит для задания набора альтернатив.
-
bash$ egrep ‘re(a|e)d’ misc.txt
-
People who read seem to be better informed than those who do not.
-
The clarinet produces sound by the vibration of its reed.
-
-
Некоторые версии sed, ed и ex поддерживают экранированные версии регулярных выражений, описанные выше. |
-
Это альтернативный способ указания диапазона символов.
-
Класс [:alnum:] — соответствует алфавитным символам и цифрам. Эквивалентно выражению A-Za-z0-9.
-
Класс [:alpha:] — соответствует символам алфавита. Эквивалентно выражению A-Za-z.
-
Класс [:blank:] — соответствует символу пробела или символу табуляции.
-
Класс [:cntrl:] — соответствует управляющим символам (control characters).
-
Класс [:digit:] — соответствует набору десятичных цифр. Эквивалентно выражению 0-9.
-
Класс [:graph:] (печатаемые и псевдографические символы) — соответствует набору символов из диапазона ASCII 33 — 126. Это то же самое, что и класс [:print:], за исключением символа пробела.
-
Класс [:lower:] — соответствует набору алфавитных символов в нижнем регистре. Эквивалентно выражению a-z.
-
Класс [:print:] (печатаемые символы) — соответствует набору символов из диапазона ASCII 32 — 126. По своему составу этот класс идентичен классу [:graph:], описанному выше, за исключением того, что в этом классе дополнительно присутствует символ пробела.
-
Класс [:space:] — соответствует пробельным символам (пробел и горизонтальная табуляция).
-
Класс [:upper:] — соответствует набору символов алфавита в верхнем регистре. Эквивалентно выражению A-Z.
-
Класс [:xdigit:] — соответствует набору шестнадцатиричных цифр. Эквивалентно выражению 0-9A-Fa-f.
Вообще, символьные классы POSIX требуют заключения в кавычки или двойные квадратные скобки ([[ ]]).
-
bash$ grep [[:digit:]] test.file
-
abc=723
-
Эти символьные классы могут использоваться, с некоторыми ограничениями, даже в операциях подстановки имен файлов (globbing).
-
bash$ ls -l ?[[:digit:]][[:digit:]]?
-
-rw-rw-r— 1 bozo bozo 0 Aug 21 14:47 a33b
-
Примеры использования символьных классов в сценариях вы найдете в Пример 12-17 и Пример 12-18.
-
Sed, awk и Perl, используемые в сценариях в качестве фильтров, могут принимать регулярные выражения в качестве входных аргументов. См. Пример A-13 и Пример A-19.
В качестве стандартного руководства по этой сложной теме можно порекомендовать «Mastering Regular Expressions», автор Friedl. Книга «Sed & Awk» (авторы Dougherty и Robbins) так же дает полное и ясное описание регулярных выражений (см. раздел Библиография).
[47] В качестве простейшего регулярного выражения можно привести строку, не содержащую никаких метасимволов.
[48] Поскольку с помощью sed, awk и grep обрабатывают одиночные строки, то обычно символ перевода строки не принимается во внимание. В тех же случаях, когда производится разбор многострочного текста, метасимвол «точка» будет соответствовать символу перевода строки.
- Страница для печати
- 16025 просмотров