Содержание

Bash-скрипты, часть 9: регулярные выражения / Хабр

Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
Bash-скрипты, часть 6: функции и разработка библиотек
Bash-скрипты, часть 7: sed и обработка текстов
Bash-скрипты, часть 8: язык обработки данных awk
Bash-скрипты, часть 9: регулярные выражения
Bash-скрипты, часть 10: практические примеры
Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

Для того, чтобы полноценно обрабатывать тексты в bash-скриптах с помощью sed и awk, просто необходимо разобраться с регулярными выражениями. Реализации этого полезнейшего инструмента можно найти буквально повсюду, и хотя устроены все регулярные выражения схожим образом, основаны на одних и тех же идеях, в разных средах работа с ними имеет определённые особенности.

([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$

На наш взгляд даже абсолютный новичок сходу поймёт, как оно устроено и зачем нужно 🙂 Если же вам не вполне понятно — просто читайте дальше и всё встанет на свои места.
Регулярное выражение — это шаблон, пользуясь которым программы вроде sed или awk фильтруют тексты. В шаблонах используются обычные ASCII-символы, представляющие сами себя, и так называемые метасимволы, которые играют особую роль, например, позволяя ссылаться на некие группы символов.

Типы регулярных выражений

Реализации регулярных выражений в различных средах, например, в языках программирования вроде Java, Perl и Python, в инструментах Linux вроде sed, awk и grep, имеют определённые особенности. Эти особенности зависят от так называемых движков обработки регулярных выражений, которые занимаются интерпретацией шаблонов.

В Linux имеется два движка регулярных выражений:

  • Движок, поддерживающий стандарт POSIX Basic Regular Expression (BRE).
  • Движок, поддерживающий стандарт POSIX Extended Regular Expression (ERE).

Большинство утилит Linux соответствуют, как минимум, стандарту POSIX BRE, но некоторые утилиты (в их числе — sed) понимают лишь некое подмножество стандарта BRE. Одна из причин такого ограничения — стремление сделать такие утилиты как можно более быстрыми в деле обработки текстов.

Стандарт POSIX ERE часто реализуют в языках программирования. Он позволяет пользоваться большим количеством средств при разработке регулярных выражений. Например, это могут быть специальные последовательности символов для часто используемых шаблонов, вроде поиска в тексте отдельных слов или наборов цифр. Awk поддерживает стандарт ERE.

Существует много способов разработки регулярных выражений, зависящих и от мнения программиста, и от особенностей движка, под который их создают. Непросто писать универсальные регулярные выражения, которые сможет понять любой движок.

Поэтому мы сосредоточимся на наиболее часто используемых регулярных выражениях и рассмотрим особенности их реализации для sed и awk.

Регулярные выражения POSIX BRE

Пожалуй, самый простой шаблон BRE представляет собой регулярное выражение для поиска точного вхождения последовательности символов в тексте. Вот как выглядит поиск строки в sed и awk:

$ echo "This is a test" | sed -n '/test/p'
$ echo "This is a test" | awk '/test/{print $0}'

Поиск текста по шаблону в sed

Поиск текста по шаблону в awk

Можно заметить, что поиск заданного шаблона выполняется без учёта точного места нахождения текста в строке. Кроме того, не имеет значение и количество вхождений. После того, как регулярное выражение найдёт заданный текст в любом месте строки, строка считается подходящей и передаётся для дальнейшей обработки.

Работая с регулярными выражениями нужно учитывать то, что они чувствительны к регистру символов:

$ echo "This is a test" | awk '/Test/{print $0}'
$ echo "This is a test" | awk '/test/{print $0}'

Регулярные выражения чувствительны к регистру

Первое регулярное выражение совпадений не нашло, так как слово «test», начинающееся с заглавной буквы, в тексте не встречается.

${}\+?|()

Если один из них нужен в шаблоне, его нужно будет экранировать с помощью обратной косой черты (обратного слэша) — \.

Например, если в тексте нужно найти знак доллара, его надо включить в шаблон, предварив символом экранирования. Скажем, имеется файл myfile с таким текстом:

There is 10$ on my pocket

Знак доллара можно обнаружить с помощью такого шаблона:

$ awk '/\$/{print $0}' myfile

Использование в шаблоне специального символа

Кроме того, обратная косая черта — это тоже специальный символ, поэтому, если нужно использовать его в шаблоне, его тоже надо будет экранировать. Выглядит это как два слэша, идущих друг за другом:

$ echo "\ is a special character" | awk '/\\/{print $0}'

Экранирование обратного слэша

Хотя прямой слэш и не входит в приведённый выше список специальных символов, попытка воспользоваться им в регулярном выражении, написанном для sed или awk, приведёт к ошибке:

$ echo "3 / 2" | awk '///{print $0}'

Неправильное использование прямого слэша в шаблоне

Если он нужен, его тоже надо экранировать:

$ echo "3 / 2" | awk '/\//{print $0}'

Экранирование прямого слэша

Якорные символы

Существуют два специальных символа для привязки шаблона к началу или к концу текстовой строки. $/{print $0}’ myfile

В данном шаблоне использовал символ отрицания, восклицательный знак — !. Благодаря использованию такого шаблона выполняется поиск строк, не содержащих ничего между началом и концом строки, а благодаря восклицательному знаку на печать выводятся лишь строки, которые не соответствуют этому шаблону.

Символ «точка»

Точка используется для поиска любого одиночного символа, за исключением символа перевода строки. Передадим такому регулярному выражению файл myfile, содержимое которого приведено ниже:

$ awk '/.st/{print $0}' myfile

Использование точки в регулярных выражениях

Как видно по выведенным данным, шаблону соответствуют лишь первые две строки из файла, так как они содержат последовательность символов «st», предварённую ещё одним символом, в то время как третья строка подходящей последовательности не содержит, а в четвёртой она есть, но находится в самом начале строки.

Классы символов

Точка соответствует любому одиночному символу, но что если нужно более гибко ограничить набор искомых символов? В подобной ситуации можно воспользоваться классами символов.

Благодаря такому подходу можно организовать поиск любого символа из заданного набора. Для описания класса символов используются квадратные скобки — []:

$ awk '/[oi]th/{print $0}' myfile

Описание класса символов в регулярном выражении

Тут мы ищем последовательность символов «th», перед которой есть символ «o» или символ «i».

Классы оказываются очень кстати, если выполняется поиск слов, которые могут начинаться как с прописной, так и со строчной буквы:

$ echo "this is a test" | awk '/[Tt]his is a test/{print $0}'
$ echo "This is a test" | awk '/[Tt]his is a test/{print $0}'

Поиск слов, которые могут начинаться со строчной или прописной буквы

Классы символов не ограничены буквами. oi]th/{print $0}’ myfile


Поиск символов, не входящих в класс

В данном случае будут найдены последовательности символов «th», перед которыми нет ни «o», ни «i».

Диапазоны символов

В символьных классах можно описывать диапазоны символов, используя тире:

$ awk '/[e-p]st/{print $0}' myfile

Описание диапазона символов в символьном классе

В данном примере регулярное выражение реагирует на последовательность символов «st», перед которой находится любой символ, расположенный, в алфавитном порядке, между символами «e» и «p».

Диапазоны можно создавать и из чисел:

$ echo "123" | awk '/[0-9][0-9][0-9]/'
$ echo "12a" | awk '/[0-9][0-9][0-9]/'

Регулярное выражение для поиска трёх любых чисел

В класс символов могут входить несколько диапазонов:

$ awk '/[a-fm-z]st/{print $0}' myfile

Класс символов, состоящий из нескольких диапазонов

Данное регулярное выражение найдёт все последовательности «st», перед которыми есть символы из диапазонов a-f и m-z.

Специальные классы символов

В BRE имеются специальные классы символов, которые можно использовать при написании регулярных выражений:

  • [[:alpha:]] — соответствует любому алфавитному символу, записанному в верхнем или нижнем регистре.
  • [[:alnum:]] — соответствует любому алфавитно-цифровому символу, а именно — символам в диапазонах 0-9, A-Z, a-z.
  • [[:blank:]] — соответствует пробелу и знаку табуляции.
  • [[:digit:]] — любой цифровой символ от 0 до 9.
  • [[:upper:]] — алфавитные символы в верхнем регистре — A-Z.
  • [[:lower:]] — алфавитные символы в нижнем регистре — a-z.
  • [[:print:]] — соответствует любому печатаемому символу.
  • [[:punct:]] — соответствует знакам препинания.
  • [[:space:]] — пробельные символы, в частности — пробел, знак табуляции, символы NL, FF, VT, CR.

Использовать специальные классы в шаблонах можно так:

$ echo "abc" | awk '/[[:alpha:]]/{print $0}'
$ echo "abc" | awk '/[[:digit:]]/{print $0}'
$ echo "abc123" | awk '/[[:digit:]]/{print $0}'

Специальные классы символов в регулярных выражениях

Символ «звёздочка»

Если в шаблоне после символа поместить звёздочку, это будет означать, что регулярное выражение сработает, если символ появляется в строке любое количество раз — включая и ситуацию, когда символ в строке отсутствует.

$ echo "test" | awk '/tes*t/{print $0}'
$ echo "tessst" | awk '/tes*t/{print $0}'

Использование символа * в регулярных выражениях

Этот шаблонный символ обычно используют для работы со словами, в которых постоянно встречаются опечатки, или для слов, допускающих разные варианты корректного написания:

$ echo "I like green color" | awk '/colou*r/{print $0}'
$ echo "I like green colour " | awk '/colou*r/{print $0}'

Поиск слова, имеющего разные варианты написания

В этом примере одно и то же регулярное выражение реагирует и на слово «color», и на слово «colour». Это так благодаря тому, что символ «u», после которого стоит звёздочка, может либо отсутствовать, либо встречаться несколько раз подряд.

Ещё одна полезная возможность, вытекающая из особенностей символа звёздочки, заключается в комбинировании его с точкой. Такая комбинация позволяет регулярному выражению реагировать на любое количество любых символов:

$ awk '/this.*test/{print $0}' myfile

Шаблон, реагирующий на любое количество любых символов

В данном случае неважно сколько и каких символов находится между словами «this» и «test».

Звёздочку можно использовать и с классами символов:

$ echo "st" | awk '/s[ae]*t/{print $0}'
$ echo "sat" | awk '/s[ae]*t/{print $0}'
$ echo "set" | awk '/s[ae]*t/{print $0}'

Использование звёздочки с классами символов

Во всех трёх примерах регулярное выражение срабатывает, так как звёздочка после класса символов означает, что если будет найдено любое количество символов «a» или «e», а также если их найти не удастся, строка будет соответствовать заданному шаблону.

Регулярные выражения POSIX ERE

Шаблоны стандарта POSIX ERE, которые поддерживают некоторые утилиты Linux, могут содержать дополнительные символы. Как уже было сказано, awk поддерживает этот стандарт, а вот sed — нет.

Тут мы рассмотрим наиболее часто используемые в ERE-шаблонах символы, которые пригодятся вам при создании собственных регулярных выражений.

▍Вопросительный знак

Вопросительный знак указывает на то, что предшествующий символ может встретиться в тексте один раз или не встретиться вовсе. Этот символ — один из метасимволов повторений. Вот несколько примеров:

$ echo "tet" | awk '/tes?t/{print $0}'
$ echo "test" | awk '/tes?t/{print $0}'
$ echo "tesst" | awk '/tes?t/{print $0}'

Вопросительный знак в регулярных выражениях

Как видно, в третьем случае буква «s» встречается дважды, поэтому на слово «tesst» регулярное выражение не реагирует.

Вопросительный знак можно использовать и с классами символов:

$ echo "tst" | awk '/t[ae]?st/{print $0}'
$ echo "test" | awk '/t[ae]?st/{print $0}'
$ echo "tast" | awk '/t[ae]?st/{print $0}'
$ echo "taest" | awk '/t[ae]?st/{print $0}'
$ echo "teest" | awk '/t[ae]?st/{print $0}'

Вопросительный знак и классы символов

Если символов из класса в строке нет, или один из них встречается один раз, регулярное выражение срабатывает, однако стоит в слове появиться двум символам и система уже не находит в тексте соответствия шаблону.

▍Символ «плюс»

Символ «плюс» в шаблоне указывает на то, что регулярное выражение обнаружит искомое в том случае, если предшествующий символ встретится в тексте один или более раз. При этом на отсутствие символа такая конструкция реагировать не будет:

$ echo "test" | awk '/te+st/{print $0}'
$ echo "teest" | awk '/te+st/{print $0}'
$ echo "tst" | awk '/te+st/{print $0}'

Символ «плюс» в регулярных выражениях

В данном примере, если символа «e» в слове нет, движок регулярных выражений не найдёт в тексте соответствий шаблону. Символ «плюс» работает и с классами символов — этим он похож на звёздочку и вопросительный знак:

$ echo "tst" | awk '/t[ae]+st/{print $0}'
$ echo "test" | awk '/t[ae]+st/{print $0}'
$ echo "teast" | awk '/t[ae]+st/{print $0}'
$ echo "teeast" | awk '/t[ae]+st/{print $0}'

Знак «плюс» и классы символов

В данном случае если в строке имеется любой символ из класса, текст будет сочтён соответствующим шаблону.

▍Фигурные скобки

Фигурные скобки, которыми можно пользоваться в ERE-шаблонах, похожи на символы, рассмотренные выше, но они позволяют точнее задавать необходимое число вхождений предшествующего им символа. Указывать ограничение можно в двух форматах:

  • n — число, задающее точное число искомых вхождений
  • n, m — два числа, которые трактуются так: «как минимум n раз, но не больше чем m».

Вот примеры первого варианта:

$ echo "tst" | awk '/te{1}st/{print $0}'
$ echo "test" | awk '/te{1}st/{print $0}'

Фигурные скобки в шаблонах, поиск точного числа вхождений

В старых версиях awk нужно было использовать ключ командной строки --re-interval для того, чтобы программа распознавала интервалы в регулярных выражениях, но в новых версиях этого делать не нужно.

$ echo "tst" | awk '/te{1,2}st/{print $0}'
$ echo "test" | awk '/te{1,2}st/{print $0}'
$ echo "teest" | awk '/te{1,2}st/{print $0}'
$ echo "teeest" | awk '/te{1,2}st/{print $0}'

Интервал, заданный в фигурных скобках

В данном примере символ «e» должен встретиться в строке 1 или 2 раза, тогда регулярное выражение отреагирует на текст.

Фигурные скобки можно применять и с классами символов. Тут действуют уже знакомые вам принципы:

$ echo "tst" | awk  '/t[ae]{1,2}st/{print $0}'
$ echo "test" | awk  '/t[ae]{1,2}st/{print $0}'
$ echo "teest" | awk  '/t[ae]{1,2}st/{print $0}'
$ echo "teeast" | awk  '/t[ae]{1,2}st/{print $0}'

Фигурные скобки и классы символов

Шаблон отреагирует на текст в том случае, если в нём один или два раза встретится символ «a» или символ «e».

▍Символ логического «или»

Символ | — вертикальная черта, означает в регулярных выражениях логическое «или». Обрабатывая регулярное выражение, содержащее несколько фрагментов, разделённых таким знаком, движок сочтёт анализируемый текст подходящим в том случае, если он будет соответствовать любому из фрагментов. Вот пример:

$ echo "This is a test" | awk '/test|exam/{print $0}'
$ echo "This is an exam" | awk '/test|exam/{print $0}'
$ echo "This is something else" | awk '/test|exam/{print $0}'

Логическое «или» в регулярных выражениях

В данном примере регулярное выражение настроено на поиск в тексте слов «test» или «exam». Обратите внимание на то, что между фрагментами шаблона и разделяющим их символом | не должно быть пробелов.

Группировка фрагментов регулярных выражений

Фрагменты регулярных выражений можно группировать, пользуясь круглыми скобками. Если сгруппировать некую последовательность символов, она будет восприниматься системой как обычный символ. То есть, например, к ней можно будет применить метасимволы повторений. Вот как это выглядит:

$ echo "Like" | awk '/Like(Geeks)?/{print $0}'
$ echo "LikeGeeks" | awk '/Like(Geeks)?/{print $0}'

Группировка фрагментов регулярных выражений

В данных примерах слово «Geeks» заключено в круглые скобки, после этой конструкции идёт знак вопроса. Напомним, что вопросительный знак означает «0 или 1 повторение», в результате регулярное выражение отреагирует и на строку «Like», и на строку «LikeGeeks».

Практические примеры

После того, как мы разобрали основы регулярных выражений, пришло время сделать с их помощью что-нибудь полезное.

▍Подсчёт количества файлов

Напишем bash-скрипт, который подсчитывает файлы, находящиеся в директориях, которые записаны в переменную окружения PATH. Для того, чтобы это сделать, понадобится, для начала, сформировать список путей к директориям. Сделаем это с помощью sed, заменив двоеточия на пробелы:

$ echo $PATH | sed 's/:/ /g'

Команда замены поддерживает регулярные выражения в качестве шаблонов для поиска текста. В данном случае всё предельно просто, ищем мы символ двоеточия, но никто не мешает использовать здесь и что-нибудь другое — всё зависит от конкретной задачи.
Теперь надо пройтись по полученному списку в цикле и выполнить там необходимые для подсчёта количества файлов действия. Общая схема скрипта будет такой:

mypath=$(echo $PATH | sed 's/:/ /g')
for directory in $mypath
 
do
 
done

Теперь напишем полный текст скрипта, воспользовавшись командой ls для получения сведений о количестве файлов в каждой из директорий:

#!/bin/bash
mypath=$(echo $PATH | sed 's/:/ /g')
count=0
for directory in $mypath
do
check=$(ls $directory)
for item in $check
do
count=$[ $count + 1 ]
done
echo "$directory - $count"
count=0
done

При запуске скрипта может оказаться, что некоторых директорий из PATH не существует, однако, это не помешает ему посчитать файлы в существующих директориях.

Подсчёт файлов

Главная ценность этого примера заключается в том, что пользуясь тем же подходом, можно решать и куда более сложные задачи. Какие именно — зависит от ваших потребностей.

▍Проверка адресов электронной почты

Существуют веб-сайты с огромными коллекциями регулярных выражений, которые позволяют проверять адреса электронной почты, телефонные номера, и так далее. Однако, одно дело — взять готовое, и совсем другое — создать что-то самому. Поэтому напишем регулярное выражение для проверки адресов электронной почты. Начнём с анализа исходных данных. Вот, например, некий адрес:

[email protected]

Имя пользователя, username, может состоять из алфавитно-цифровых и некоторых других символов. А именно, это точка, тире, символ подчёркивания, знак «плюс». За именем пользователя следует знак @.

Вооружившись этими знаниями, начнём сборку регулярного выражения с его левой части, которая служит для проверки имени пользователя. ([a-zA-Z0-9_\-\.\+]+)@

Это регулярное выражение можно прочитать так: «В начале строки должен быть как минимум один символ из тех, которые имеются в группе, заданной в квадратных скобках, а после этого должен идти знак @».

Теперь — очередь имени хоста — hostname. Тут применимы те же правила, что и для имени пользователя, поэтому шаблон для него будет выглядеть так:

([a-zA-Z0-9_\-\.]+)

Имя домена верхнего уровня подчиняется особым правилам. Тут могут быть лишь алфавитные символы, которых должно быть не меньше двух (например, такие домены обычно содержат код страны), и не больше пяти. Всё это значит, что шаблон для проверки последней части адреса будет таким:

\.([a-zA-Z]{2,5})$

Прочесть его можно так: «Сначала должна быть точка, потом — от 2 до 5 алфавитных символов, а после этого строка заканчивается».

Подготовив шаблоны для отдельных частей регулярного выражения, соберём их вместе:

^([a-zA-Z0-9_\-\. ([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'

Проверка адреса электронной почты с помощью регулярных выражений

То, что переданный awk текст выводится на экран, означает, что система распознала в нём адрес электронной почты.

Итоги

Если регулярное выражение для проверки адресов электронной почты, которое встретилось вам в самом начале статьи, казалось тогда совершенно непонятным, надеемся, сейчас оно уже не выглядит бессмысленным набором символов. Если это действительно так — значит данный материал выполнил своё предназначение. На самом деле, регулярные выражения — это тема, которой можно заниматься всю жизнь, но даже то немногое, что мы разобрали, уже способно помочь вам в написании скриптов, которые довольно продвинуто обрабатывают тексты.

В этой серии материалов мы обычно показывали очень простые примеры bash-скриптов, которые состояли буквально из нескольких строк. В следующий раз рассмотрим кое-что более масштабное.

Уважаемые читатели! А вы пользуетесь регулярными выражениями при обработке текстов в сценариях командной строки?

Шпаргалка по регулярным выражениям — Exlab

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child (подробнее).

  • Скачать в PDF     ~96 кб
  • Скачать в PNG     ~81 кб

Помните, что различные языки программирования поддерживают регулярные выражения в разной степени, поэтому вы можете столкнуться с ситуацией, когда некоторые из указанных возможностей не будут работать. Для тех же, кто только знакомится с регулярными выражениями, предлагается этот перевод авторских комментариев к шпаргалке. обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.

Символьные классы

Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \d соответствует любой цифре от 0 до 9 включительно, \w соответствует буквам и цифрам, а \W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

\w\s

POSIX

POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.

Утверждения

Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”». \s]*).

Образцы шаблонов

В этой группе представлены образцы шаблонов. С их помощью вы можете увидеть, как можно использовать регулярные выражения в ежедневной практике. Однако заметьте, что они не обязательно будут работать в любом языке программирования, поскольку каждый из них обладает индивидуальными особенностями и различным уровнем поддержки регулярных выражений.

Кванторы

Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

a{10,20}

По умолчанию кванторы — «жадные». Поэтому квантор +, означающий «один или больше раз», будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:

".*"

Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:

<a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a>

Приведенный выше шаблон найдет в этой строке вот такую подстроку:

"helloworld.htm" title="Привет, Мир"

Он оказался слишком жадным, захватив наибольший кусок текста, который смог.

".*?"

Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор ?) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойных кавычках по отдельности:

"helloworld.htm"
"Привет, Мир"

Специальные символы

Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать «.» в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается с помощью знака экранирования.

Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).

Шаблон для нахождения точки таков:

\.

Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой. A-Fa-f0-9]

Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.

Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

(ab|bc)

Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать \n, где вместо n подставить номер нужной группы. Вам может понадобиться шаблон, соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуется с помощью групп:

(aaa|bbb)[0-9]+\1

Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ([0-9]+), и наконец \1. Последняя часть шаблона ссылается на первую группу и ищет то же самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. A-Za-z0-9])

Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:

$1<b>$2</b>$3

Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его $1. Без этого мы бы просто удалили этот символ из текста. То же касается конца подстановки ($3). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него вы можете использовать CSS или <strong>), выделив им вторую группу, найденную по шаблону ($2).

Модификаторы шаблонов

Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.

Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:

/pattern/

Модификаторы добавляются в конец этой строки, вот так:

/pattern/i

Мета-символы

Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:

\(

  • Шпаргалка по mod_rewrite
  • Шпаргалка по CSS

Шпаргалка по регулярным выражениям

Квантификаторы

 АналогПримерОписание
?{0,1}a?одно или ноль вхождений «а»
+{1,}a+одно или более вхождений «а»
*{0,}a*ноль или более вхождений «а»

Модификаторы

Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание. — начало строки в тексте, $— конец строки в тексте.sтекст воспринимается как одна строка, спец символ «точка» (.) будет вкючать и перевод строкиuиспользуется кодировка UTF-8Uинвертировать жадностьxигнорировать все неэкранированные пробельные и перечисленные в классе символы

 АналогОписание
() подмаска, вложенное выражение
[] групповой символ
{a,b} количество вхождений от «a» до «b»
| логическое «или», в случае с односимвольными альтернативами используйте []
\ экранирование спец символа
. любой сивол, кроме перевода строки
\d[0-9]десятичная цифра
\D[^\d]любой символ, кроме десятичной цифры
\f конец (разрыв) страницы
\n перевод строки
\pL буква в кодировке UTF-8 при использовании модификатора u
\r возврат каретки
\s[ \t\v\r\n\f]пробельный символ
\S[^\s]любой символ, кроме промельного
\t табуляция
\w[0-9a-z_]любая цифра, буква или знак подчеркивания
\W[^\w]любой символ, кроме цифры, буквы или знака подчеркивания
\v вертикальная табуляция

Спецсимволы внутри символьного класса

 ПримерОписание
^[^da]отрицание, любой символ кроме «d» или «a»
[a-z]интервал, любой симво от «a» до «z»

Позиция внутри строки

 ПримерСоответствиеОписание
^^aaaa aaaначало строки
$a$aaa aaaконец строки
\A\Aaaaa aaa
aaa aaa
начало текста
\za\zaaa aaa
aaa aaa
конец текста
\ba\b
\ba
aaa aaa
aaa aaa
граница слова, утверждение: предыдущий символ словесный, а следующий — нет, либо наоборот
\B\Ba\Baaa aaaотсутствие границы слова
\G\Gaaaa aaaПредыдущий успешный поиск, поиск остановился на 4-й позиции — там, где не нашлось a
Скачать в PDF, PNG. обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.

Символьные классы

Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \dсоответствует любой цифре от 0 до 9 включительно, \wсоответствует буквам и цифрам, а \W— всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

\w\s

POSIX

POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.

Утверждения

Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”». \s]*).

Кванторы

Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

a{10,20}

По умолчанию кванторы — «жадные». Поэтому квантор +, означающий «один или больше раз», будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:

".*"

Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:

<a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a>

Приведенный выше шаблон найдет в этой строке вот такую подстроку:

"helloworld.htm" title="Привет, Мир"

Он оказался слишком жадным, захватив наибольший кусок текста, который смог.

".*?"

Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор ?) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойных кавычках по отдельности:

"helloworld.htm" "Привет, Мир"

Экранирование в регулярных выражениях

Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать «.» в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается с помощью знака экранирования.

Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. {|}в качестве их буквальных значений.\Qне соответствует ничему, только экранирует все символы вплоть до \E\Eне соответствует ничему, только прекращает экранирование, начатое \Q

Подстановка строк

Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.

Группы и диапазоны

Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:

[A-Fa-f0-9]

Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:

[^A-Fa-f0-9]

Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.

Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

(ab|bc)

Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать \n, где вместо nподставить номер нужной группы. Вам может понадобиться шаблон, соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуется с помощью групп:

(aaa|bbb)[0-9]+\1

Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ([0-9]+), и наконец \1. Последняя часть шаблона ссылается на первую группу и ищет то же самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Таким образом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как \1будет искать «aaa» после числа.

Одним из наиболее полезных инструментов в регулярных выражениях является подстановка строк. A-Za-z0-9])

Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:

$1<b>$2</b>$3

Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его $1. Без этого мы бы просто удалили этот символ из текста. То же касается конца подстановки ($3). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него вы можете использовать CSS или <strong>), выделив им вторую группу, найденную по шаблону ($2).

Модификаторы шаблонов

Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор iзаставляет парсер игнорировать регистры.

Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:

/pattern/

Модификаторы добавляются в конец этой строки, вот так:

/pattern/i

Мета-символы

Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:

\(

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.

  1. Регулярные выражения

Регулярные выражения PHP -Кванторы, мета-символы и модификаторы

Регулярные выражения — это не что иное, как последовательность или шаблон самих символов. Они обеспечивают основу для соответствия шаблону.

Содержание:

  • Регулярные выражения POSIX
  • Скобки
  • Кванторы
  • Предопределенные диапазоны символов
  • PHP- функции Regexp POSIX
  • Регулярные выражения типа PERL
  • Мета-символы
  • Модификаторы
  • Поддерживаемые PHP-функции Regexp PERL

Используя регулярное выражение, вы можете искать определенную строку внутри другой строки, вы можете заменить одну строку другой строкой, и вы можете разбить строку на многие фрагменты.

PHP предлагает функции, специфичные для двух наборов функций регулярного выражения, каждый из которых соответствует определенному типу регулярного выражения. Вы можете использовать любой из них на основе вашего комфорта.

  • Регулярные выражения POSIX
  • Регулярные выражения типа PERL

Регулярные выражения POSIX

Структура регулярного выражения POSIX не отличается от структуры типичного арифметического выражения: различные элементы (операторы) объединяются для формирования более сложных выражений.

Простейшим регулярным выражением является тот, который соответствует одному символу, например о, внутри строк, таких как о, торг или сумо.

Давайте дадим объяснение нескольким понятиям, которые используются в регулярном выражении POSIX. После этого мы познакомим вас с функциями, связанными с регулярным выражением.

Скобки

Скобки ([]) имеют особое значение при использовании в контексте регулярных выражений. Они используются для поиска диапазона символов.

#ЗначениеОписание
[0-9]Он соответствует любой десятичной цифре от 0 до 9.
[AZ]Он соответствует любому символу от нижнего регистра a до нижнего регистра z.
[AZ]Он соответствует любому символу в верхнем регистре A в верхнем регистре Z.
[Az]Он соответствует любому символу от нижнего регистра a до верхнего регистра Z.

Диапазоны, показанные выше, являются общими; вы также можете использовать диапазон [0-3] для соответствия любой десятичной цифре в диапазоне от 0 до 3 или диапазону [bv], чтобы соответствовать любому строчному символу в диапазоне от b до v.

Кванторы

Частоту или положение заключенных в скобки символьных последовательностей и одиночных символов можно обозначить специальным символом. Каждый особый персонаж имеет конкретную коннотацию. +, * ,? , {int. range} и $ flags следуют за символьной последовательностью.

#ЗначениеОписание
р +Он соответствует любой строке, содержащей хотя бы один p.
п*Он соответствует любой строке, содержащей ноль или более p.
p ?Он соответствует любой строке, содержащей ноль или более p. Это просто альтернативный способ использования p *. . {2} $Он соответствует любой строке, содержащей ровно два символа.
(.*).Он соответствует любой строке, заключенной внутри b и / b.
p ( hp ) *Он соответствует любой строке, содержащей ap, а затем ноль или более экземпляров последовательности php.

Предопределенные диапазоны символов

Для вашего удобства программирования доступны несколько предопределенных диапазонов символов, также известных как классы символов. Классы символов задают весь диапазон символов, например, алфавит или целочисленный набор —

ЗначениеОписание
[[:alpha:]]Он соответствует любой строке, содержащей алфавитные символы aA через zZ .
[[:digit:]]Он соответствует любой строке, содержащей числовые цифры от 0 до 9.
[[:alnum:]]Он соответствует любой строке, содержащей буквенно-цифровые символы aA через zZ и от 0 до 9.
[[:space:]]Он соответствует любой строке, содержащей пробел.

PHP- функции Regexp POSIX

PHP в настоящее время предлагает семь функций для поиска строк с использованием регулярных выражений в стиле POSIX —

ЗначениеОписание
ereg()Функция ereg() ищет строку, указанную строкой для строки, заданной шаблоном, возвращает true, если шаблон найден, и false в противном случае.
ereg_replace ()Функция ereg_replace() ищет строку, указанную в шаблоне, и заменяет шаблон заменой, если найден.
eregi()Функция eregi() выполняет поиск по всей строке, заданной шаблоном, для строки, указанной строкой. Поиск не чувствителен к регистру.
eregi_replace()Функция eregi_replace() работает точно так же, как и ereg_replace(), за исключением того, что поиск шаблона в строке не чувствителен к регистру.
Split()Функция split() будет разделять строку на различные элементы, границы каждого элемента на основе появления шаблона в строке.
spliti()Функция spliti() работает точно так же, как и sibling split(), за исключением того, что она не чувствительна к регистру.
sql_regcase()Функция sql_regcase() может рассматриваться как служебная функция, преобразующая каждый символ в строку входных параметров в выражение в квадратных скобках, содержащее два символа.

Регулярные выражения типа PERL

Регулярные выражения в стиле Perl похожи на их аналоги POSIX. Синтаксис POSIX можно использовать почти взаимозаменяемо с функциями регулярного выражения в стиле Perl. Фактически, вы можете использовать любой из кванторов, введенный в предыдущем разделе POSIX.

Давайте дадим объяснение нескольким понятиям, которые используются в регулярных выражениях PERL. После этого мы представим вам Жека регулярных функцийсвязанных выражений.

Мета-символы

Мета характер просто алфавитный символ предшествует обратный слэш , который действует , чтобы дать комбинации особое значение.

Например, вы можете искать большие денежные суммы, используя метасимвол ‘\ d’: / ( [\ d] +) 000 / , Здесь \ d будет искать любую строку числового символа.

Ниже приведен список метасимволов, которые могут использоваться в регулярных выражениях типа PERL.

СимволОписание
,один символ
\ sсимвол пробела (пробел, табуляция, новая строка)
\ Sне-пробельный символ
\ dцифра(0-9)
\ D— не цифра
\ wсимвол слова (az, AZ, 0-9, _)
\ W— символ без слова
[ aeiou ]соответствует одному символу в заданном наборе
[^ aeiou ]соответствует одному символу за пределами заданного набора
( foo | bar | baz )соответствует любой из указанных альтернатив

Модификаторы

Доступны несколько модификаторов, которые могут облегчить вашу работу с регулярными выражениями , например, чувствительность к регистру, поиск по нескольким линиям и т. и $ сопоставление с границей новой строки, а не граница строкиoоценивает выражение только один разsПозволяет использовать. для соответствия символу новой строкиxПозволяет использовать пробел в выражении для ясностиgГлобально находит все совпаденияcgПозволяет продолжить поиск даже после сбоя глобального соответствия

Поддерживаемые PHP-функции Regexp PERL

PHP предлагает следующие функции для поиска строк с использованием Perl-совместимых регулярных выражений —

ЗначениеОписание
preg_match()Функция preg_ match ( ) ищет строку для шаблона, возвращает true, если шаблон существует, и false в противном случае.
preg_match_all()Функция preg_match_ all ( ) соответствует всем вхождениям шаблона в строке.
preg_replace()Функция preg_ replace ( ) работает так же, как и ereg_replace (), за исключением того, что регулярные выражения могут использоваться в шаблонах и параметрах замены.
preg_split()Функция preg_ split ( ) работает точно так же, как split (), за исключением того, что регулярные выражения принимаются в качестве входных параметров для шаблона.
preg_grep()Функция preg_ grep ( ) выполняет поиск всех элементов input_array , возвращая все элементы, соответствующие шаблону regexp .
preg_quote()Ответить символы регулярного выражения

 С уважением, авторы сайта Компьютерапия


Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

Регулярные выражения онлайн конструктор

Флаг:
PREG_SET_ORDERPREG_PATTERN_ORDERPREG_OFFSET_CAPTURE
Шаблон:

Текст:

Управляющие символы

ПредставлениеСимволРасшифровка
\tТабуляцияHorizontal tabulation
\vВертикальная табуляцияVertical tabulation
\rВозврат кареткиCarriage return
\nПеревод строкиLine feed
\fКонец страницыForm feed
\aЗвонокBell character
\eEscape-символEscape character
\bЗабой

Должен находиться внутри квадратных скобок (иначе интерпретируется как граница слова). \s]

Непробельный символ

Символьные классы POSIX

POSIX-классЭквивалентЗначение
[:upper:][A-Z]Символы верхнего регистра
[:lower:][a-z]Символы нижнего регистра
[:alpha:][[:upper:][:lower:]]Буквы
[:digit:][0-9], т. е. \dЦифры
[:xdigit:][[:digit:]A-Fa-f]Шестнадцатеричные цифры
[:alnum:][[:alpha:][:digit:]]Буквы и цифры
[:word:][[:alnum:]_], т. е. \wСимволы, образующие «слово»
[:punct:][-!»#$%&'()* ,./:;?@[\\\]_`{|}~]Знаки пунктуации
[:blank:][ \t]Пробел и табуляция
[:space:][[:blank:]\v\r\n\f], т. aaaa aaa
$Конец строкиa$aaa aaa
\bГраница словаa\baaa aaa
\baaaa aaa
\BНе граница слова\Ba\Baaa aaa
\GПредыдущий успешный поиск\Gaaaa aaa (поиск остановился на 4-й позиции — там, где не нашлось a)

Представление символов по их коду

ПредставлениеПояснениеКодировка
\0nn — восьмеричное число от 0 до 3778-битная
\xddd — шестнадцатеричная цифра
\udddd16-битная (Юникод)

Квантификация (поиск последовательностей)

ПредставлениеЧисло повторенийПримерСоответствие
{n}Ровно n разcolou{3}rcolouuur
{m,n}От m до n включительноcolou{2,4}rcolouur, colouuur, colouuuur
{m,}Не менее mcolou{2,}rcolouur, colouuur, colouuuur и т. д.
{,n}Не более ncolou{,3}rcolor, colour, colouur, colouuur

&nbsp

ПредставлениеЧисло повторенийЭквивалентПримерСоответствие
*Ноль или более{0,}colou*rcolor, colour и т. д.
+Одно или более{1,}colou rcolour, colouur и т. д. (но не color)
?Ноль или одно{0,1}colou?rcolor, colour

Перечисление

Вертикальная черта разделяет допустимые варианты. Например, gray|grey соответствует gray или grey. Следует помнить, что перебор вариантов выполняется слева направо, как они указаны.

Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу. Например, gray|grey или gr(a|e)y описывают строку gray или grey. В случае с односимвольными альтернативами предпочтителен вариант gr[ae]y, так как сравнение с символьным классом выполняется проще, чем обработка группы с проверкой на все её возможные модификаторы и генерацией обратной связи.

оригинал статьи wiki

руководство по созданию, применение, примеры. Регулярные выражения grep, egrep, sed в Linux Регулярные выражения unix

Доброго времени, гости!

В сегодняшней статье хочу коснуться такой огромной темы как Регулярные выражения . Думаю всем известно, что тема регексов (так регулярные выражения называются на сленге) — необъятна в объеме одного поста. Посему постараюсь кратко, но как можно понятней собрать в кучу свои мысли и донести их до Вас в .

Начну с того, что существует несколько разновидностей регулярных выражений:

1. Традиционные регулярные выражения (они же основные, базовые и

basic regular expressions (BRE))
  • синтаксис данных выражений определен, как устаревший, но тем не менее до сих пор широко распространен и используется многими утилитами UNIX
  • Основные регулярные выражения включают в себя следующие метасимволы (об их значениях ниже):
    • \{ \} — первоначальный вариант для { } (в расширенных)
    • \(\) — первоначальный вариант для () (в расширенных)
    • \n , где n — номер от 1 до 9
  • Особенности использования данных метасимволов:
    • Звёздочка должна следовать после выражения, соответствующего единичному символу. -0-9] .
  • Чтобы добавить символ [ или ] в набор, его следует поместить туда первым. Например:
    • соответствует ] , [ , a или b .

2. Расширенные регулярные выражения (они же

extended regular expressions (ERE))
  • Синтаксис данных выражений аналогичен синтаксису основных выражений, за исключением:
    • Отменено использование обратной косой черты для метасимволов { } и () .
    • Обратная косая черта перед метасимволом отменяет его специальное значение.
    • Отвергнута теоретически нерегулярная конструкция \n .
    • Добавлены метасимволы + , ? , | .

3. Регулярные выражения, совместимые с Perl (они же

Perl-compatible regular expressions (PCRE))
  • имеют более богатый и в то же время предсказуемый синтаксис, чем даже POSIX ERE, поэтому часто используется приложениями.

Регулярные выражения состоят из шаблонов, вернее сказать задают шаблон поиска. Шаблон состоит из правил поиска, которые составляются из символов и метасимволов .

Правила поиска определяются следующими операциями :

Перечисление |

Вертикальная черта (|) разделяет допустимые варианты, можно сказать — логическое ИЛИ. Например, «gray|grey» соответствует gray или grey .

Группировка или объединение ()

Круглые скобки используются для определения области действия и приоритета операторов. Например, «gray|grey» и «gr(a|e)y» являются разными образцами, но они оба описывают множество, содержащее gray и grey .

Квантификация {} ? * +

Квантификатор после символа или группы определяет, сколько раз предшествующее выражение может встречаться.

общее выражение, повторений может быть от m до n включительно .

общее выражение, m и более повторений .

общее выражение, не более n повторений .

ровно n повторений .

Знак вопроса означает 0 или 1 раз, то же самое, что и {0,1} . Например, «colou?r» соответствует и color , и colour .

Звёздочка означает 0, 1 или любое число раз ({0,} ). Например, «go*gle» соответствует ggle , gogle , google и др.

Плюс означает хотя бы 1 раз ({1,} ). Например, «go+gle» соответствует gogle , google и т. д. (но не ggle ).

Конкретный синтаксис данных регулярных выражений зависит от реализации. (то есть в базовых регулярных выражениях символы { и } — экранируются обратным слешем)

Метасимволы , говоря простым языком — это символы, которые не соответствуют своему реальному значению, то есть символ. (точка) — это не точка, а любой один символ, и т.п. прошу ознакомиться с метасимволами и их значениями:

.соответствует одному любому символу
[что-то]Соответствует любому единичному символу из числа заключённых в скобки.Соответствует началу текста (или началу любой строки, если режим построчный).
$Соответствует концу текста (или концу любой строки, если режим построчный).
\(\) или ()Объявляет «отмеченное подвыражение» (сгруппированное выражение), которое может быть использовано позже (см. следующий элемент: \n ). «Отмеченное подвыражение» также является «блоком». В отличие от других операторов, этот (в традиционном синтаксисе) требует бэкслеша, в расширенном и Perl символ \ — не нужен.
\n Где n — это цифра от 1 до 9; соответствует n -му отмеченному подвыражению (например (abcd)\0, то есть символы abcd отмечены нулем). Эта конструкция теоретически нерегулярна , она не была принята в расширенном синтаксисе регулярных выражений.
*
  • Звёздочка после выражения, соответствующего единичному символу, соответствует нулю или более копий этого (предшествующего) выражения. Например, «*» соответствует пустой строке, «x», «y», «zx», «zyx», и т. д.
  • \n *, где n — это цифра от 1 до 9, соответствует нулю или более вхождений для соответствия n -го отмеченного подвыражения. Например, «\(a.\)c\1*» соответствует «abcab» и «abcaba», но не «abcac».

Выражение, заключённое в «\(» и «\)» и сопровождаемое «*», следует считать неправильным. В некоторых случаях, оно соответствует нулю или более вхождений строки, которая была заключена в скобки. В других, оно соответствует выражению, заключённому в скобки, учитывая символ «*».

\{x ,y \}Соответствует последнему (предстоящему ) блоку, встречающемуся не менее x и не более y раз. Например, «a\{3,5\}» соответствует «aaa», «aaaa» или «aaaaa». В отличие от других операторов, этот (в традиционном синтаксисе) требует бэкслеша.
.*Обозначение любого количества любых символов между двумя частями регулярного выражения.

Метасимволы нам помогают использовать различные соответствия. Но как же представить метасимвол обычным символом, то есть символ [ (квадратная скобка) значением квадратной скобки? Просто:

  • необходимо предварить (экранировать ) метасимвол (. * + \ ? { }) обратным слешем. Например \. или \[

Для упрощения задания некоторых наборов символов, их объединили в т.н.классы и категории символов . POSIX стандартизовал объявление некоторых классов и категорий символов, как показано в следующей таблице:

POSIX классаналогичнообозначение
[:upper:]символы верхнего регистра
[:lower:]символы нижнего регистра
[:alpha:]символы верхнего и нижнего регистра
[:alnum:]цифры, символы верхнего и нижнего регистра
[:digit:]цифры
[:xdigit:]шестнадцатеричные цифры
[:punct:][. \t\n\r\f\v]символы печати и символы пропуска

В regex есть такое понятие как:

Жадность regex

Постараюсь описать как можно понятней. Допустим, мы хотим найти все HTML теги в каком-то тексте. Локализовав задачу, мы хотим найти значения заключенные между , вместе с этими самыми скобками. Но мы знаем, что теги имеют разную длину и самих тегов, как минимум штук 50. Перечислять их все, заключив в метасимволы — задача слишком трудоемкая. Но мы знаем, что у нас есть выражение.* (точка звездочка), характеризующее любое число любых символов в строке. С помощью данного выражения мы попытаемся найти в тексте (

Итак, Как создать RAID уровня 10/50 на контроллере LSI MegaRAID (актуально и для: Intel SRCU42x, Intel SRCS16):

) все значения между . В результате, этому выражению будет соответствовать ВСЯ строка. почему, потому что регекс — ЖАДЕН и старается захватить ЛЮБОЕ ВСЕ количество символов между , соответственно вся строка, начиная p>Итак,. .. и заканчивая > будет принадлежать данному правилу!

Надеюсь, на примере понятно что такое жадность. Чтобы избавиться от данной жадности, можно пойти по следующему пути:

  • учесть символы, не соответствующие желаемому образцу (например: ]*> для вышеописанного случая)
  • избавить от жадности, добавив определении квантификатора, как нежадного:
    • *? — «не жадный» («ленивый») эквивалент *
    • +? — «не жадный» («ленивый») эквивалент +
    • {n,}? — «не жадный» («ленивый») эквивалент {n,}
    • .*? — «не жадный» («ленивый») эквивалент.*

Все вышенаписанное хочу дополнить синтаксисом расширенных регулярных выражений:

Регулярные выражения в POSIX аналогичны традиционному Unix-синтаксису, но с добавлением некоторых метасимволов:

Плюс указывает на то, что предыдущий символ или группа может повторяться один или несколько раз . В отличие от звёздочки, хотя бы одно повторение обязательно.

Знак вопроса делает предыдущий символ или группу необязательной. Другими словами, в соответствующей строке она может отсутствовать, либо присутствовать ровно один раз.

Вертикальная черта разделяет альтернативные варианты регулярных выражений. Один символ задаёт две альтернативы, но их может быть и больше, достаточно использовать больше вертикальных чёрточек. Необходимо помнить, что этот оператор использует максимально возможную часть выражения. По этой причине, оператор альтернативы чаще всего используется внутри скобок.

Также было отменено использование обратной косой черты: \{…\} становится {…} и \(…\) становится (…).

В завершение поста, приведу некоторые примеры использования regex:

$ cat text1 1 apple 2 pear 3 banana $ grep p text1 1 apple 2 pear $ grep «pp*» text1 1 apple 2 pear $ cat text1 | grep «l\|n» 1 apple 3 banana $ echo -e «find an\n* here» | grep «\*» * here $ grep «pl\?.*r» text1 # p, в строках где есть r 2 pear $ grep «a. .» text1 # строки с a, за которой следует как минимум 2 символа 1 apple 3 banana $ grep «» text1 # поиск строк, где есть 3 или p 1 apple 2 pear 3 banana $ echo -e «find an\n* here\nsomewhere.» | grep «[.*]» * here somewhere..name]$ echo -e «123\n456\n789\n0» | grep «» 123 456 789 $ sed -e «/\(a.*a\)\|\(p.*p\)/s/a/A/g» text1 # замена а на А во всех строках, где после а идет а или после р идет р 1 Apple 2 pear 3 bAnAnA *\./ LAST WORD./g» First. A LAST WORD. This is a LAST WORD.

С Уважением, Mc.Sim!

Для того, чтобы полноценно обрабатывать тексты в bash-скриптах с помощью sed и awk, просто необходимо разобраться с регулярными выражениями. Реализации этого полезнейшего инструмента можно найти буквально повсюду, и хотя устроены все регулярные выражения схожим образом, основаны на одних и тех же идеях, в разных средах работа с ними имеет определённые особенности. Тут мы поговорим о регулярных выражениях, которые подходят для использования в сценариях командной строки Linux.

Этот материал задуман как введение в регулярные выражения, рассчитанное на тех, кто может совершенно не знать о том, что это такое. Поэтому начнём с самого начала.

Что такое регулярные выражения

У многих, когда они впервые видят регулярные выражения, сразу же возникает мысль, что перед ними бессмысленное нагромождение символов. Но это, конечно, далеко не так. Взгляните, например, на это регулярное выражение


На наш взгляд даже абсолютный новичок сходу поймёт, как оно устроено и зачем нужно:) Если же вам не вполне понятно — просто читайте дальше и всё встанет на свои места.
Регулярное выражение — это шаблон, пользуясь которым программы вроде sed или awk фильтруют тексты. В шаблонах используются обычные ASCII-символы, представляющие сами себя, и так называемые метасимволы, которые играют особую роль, например, позволяя ссылаться на некие группы символов.

Типы регулярных выражений

Реализации регулярных выражений в различных средах, например, в языках программирования вроде Java, Perl и Python, в инструментах Linux вроде sed, awk и grep, имеют определённые особенности. Эти особенности зависят от так называемых движков обработки регулярных выражений, которые занимаются интерпретацией шаблонов.
В Linux имеется два движка регулярных выражений:

  • Движок, поддерживающий стандарт POSIX Basic Regular Expression (BRE).
  • Движок, поддерживающий стандарт POSIX Extended Regular Expression (ERE).

Большинство утилит Linux соответствуют, как минимум, стандарту POSIX BRE, но некоторые утилиты (в их числе — sed) понимают лишь некое подмножество стандарта BRE. Одна из причин такого ограничения — стремление сделать такие утилиты как можно более быстрыми в деле обработки текстов.

Стандарт POSIX ERE часто реализуют в языках программирования. Он позволяет пользоваться большим количеством средств при разработке регулярных выражений. Например, это могут быть специальные последовательности символов для часто используемых шаблонов, вроде поиска в тексте отдельных слов или наборов цифр. Awk поддерживает стандарт ERE.

Существует много способов разработки регулярных выражений, зависящих и от мнения программиста, и от особенностей движка, под который их создают. Непросто писать универсальные регулярные выражения, которые сможет понять любой движок. Поэтому мы сосредоточимся на наиболее часто используемых регулярных выражениях и рассмотрим особенности их реализации для sed и awk.

Регулярные выражения POSIX BRE

Пожалуй, самый простой шаблон BRE представляет собой регулярное выражение для поиска точного вхождения последовательности символов в тексте. Вот как выглядит поиск строки в sed и awk:

$ echo «This is a test» | sed -n «/test/p» $ echo «This is a test» | awk «/test/{print $0}»

Поиск текста по шаблону в sed

Поиск текста по шаблону в awk

Можно заметить, что поиск заданного шаблона выполняется без учёта точного места нахождения текста в строке. Кроме того, не имеет значение и количество вхождений. После того, как регулярное выражение найдёт заданный текст в любом месте строки, строка считается подходящей и передаётся для дальнейшей обработки.

Работая с регулярными выражениями нужно учитывать то, что они чувствительны к регистру символов:

$ echo «This is a test» | awk «/Test/{print $0}» $ echo «This is a test» | awk «/test/{print $0}»

Регулярные выражения чувствительны к регистру

Первое регулярное выражение совпадений не нашло, так как слово «test», начинающееся с заглавной буквы, в тексте не встречается. Второе же, настроенное на поиск слова, написанного прописными буквами, обнаружило в потоке подходящую строку.

В регулярных выражениях можно использовать не только буквы, но и пробелы, и цифры:

$ echo «This is a test 2 again» | awk «/test 2/{print $0}»

Поиск фрагмента текста, содержащего пробелы и цифры

Пробелы воспринимаются движком регулярных выражений как обычные символы.

Специальные символы

При использовании различных символов в регулярных выражениях надо учитывать некоторые особенности. ${}\+?|()
Если один из них нужен в шаблоне, его нужно будет экранировать с помощью обратной косой черты (обратного слэша) — \ .

Например, если в тексте нужно найти знак доллара, его надо включить в шаблон, предварив символом экранирования. Скажем, имеется файл myfile с таким текстом:

There is 10$ on my pocket
Знак доллара можно обнаружить с помощью такого шаблона:

$ awk «/\$/{print $0}» myfile

Использование в шаблоне специального символа

Кроме того, обратная косая черта — это тоже специальный символ, поэтому, если нужно использовать его в шаблоне, его тоже надо будет экранировать. Выглядит это как два слэша, идущих друг за другом:

$ echo «\ is a special character» | awk «/\\/{print $0}»

Экранирование обратного слэша

Хотя прямой слэш и не входит в приведённый выше список специальных символов, попытка воспользоваться им в регулярном выражении, написанном для sed или awk, приведёт к ошибке:

$ echo «3 / 2» | awk «///{print $0}»

Неправильное использование прямого слэша в шаблоне

Если он нужен, его тоже надо экранировать:

$ echo «3 / 2» | awk «/\//{print $0}»

Экранирование прямого слэша

Якорные символы

Существуют два специальных символа для привязки шаблона к началу или к концу текстовой строки. $/{print $0}» myfile
В данном шаблоне использовал символ отрицания, восклицательный знак — ! . Благодаря использованию такого шаблона выполняется поиск строк, не содержащих ничего между началом и концом строки, а благодаря восклицательному знаку на печать выводятся лишь строки, которые не соответствуют этому шаблону.

Символ «точка»

Точка используется для поиска любого одиночного символа, за исключением символа перевода строки. Передадим такому регулярному выражению файл myfile , содержимое которого приведено ниже:

$ awk «/.st/{print $0}» myfile

Использование точки в регулярных выражениях

Как видно по выведенным данным, шаблону соответствуют лишь первые две строки из файла, так как они содержат последовательность символов «st», предварённую ещё одним символом, в то время как третья строка подходящей последовательности не содержит, а в четвёртой она есть, но находится в самом начале строки.

Классы символов

Точка соответствует любому одиночному символу, но что если нужно более гибко ограничить набор искомых символов? В подобной ситуации можно воспользоваться классами символов.

Благодаря такому подходу можно организовать поиск любого символа из заданного набора. Для описания класса символов используются квадратные скобки — :

$ awk «/th/{print $0}» myfile

Описание класса символов в регулярном выражении

Тут мы ищем последовательность символов «th», перед которой есть символ «o» или символ «i».

Классы оказываются очень кстати, если выполняется поиск слов, которые могут начинаться как с прописной, так и со строчной буквы:

$ echo «this is a test» | awk «/his is a test/{print $0}» $ echo «This is a test» | awk «/his is a test/{print $0}»

Поиск слов, которые могут начинаться со строчной или прописной буквы

Классы символов не ограничены буквами. oi]th/{print $0}» myfile

Поиск символов, не входящих в класс

В данном случае будут найдены последовательности символов «th», перед которыми нет ни «o», ни «i».

Диапазоны символов

В символьных классах можно описывать диапазоны символов, используя тире:

$ awk «/st/{print $0}» myfile

Описание диапазона символов в символьном классе

В данном примере регулярное выражение реагирует на последовательность символов «st», перед которой находится любой символ, расположенный, в алфавитном порядке, между символами «e» и «p».

Диапазоны можно создавать и из чисел:

$ echo «123» | awk «//» $ echo «12a» | awk «//»

Регулярное выражение для поиска трёх любых чисел

В класс символов могут входить несколько диапазонов:

$ awk «/st/{print $0}» myfile

Класс символов, состоящий из нескольких диапазонов

Данное регулярное выражение найдёт все последовательности «st», перед которыми есть символы из диапазонов a-f и m-z .

Специальные классы символов

В BRE имеются специальные классы символов, которые можно использовать при написании регулярных выражений:

  • [[:alpha:]] — соответствует любому алфавитному символу, записанному в верхнем или нижнем регистре.
  • [[:alnum:]] — соответствует любому алфавитно-цифровому символу, а именно — символам в диапазонах 0-9 , A-Z , a-z .
  • [[:blank:]] — соответствует пробелу и знаку табуляции.
  • [[:digit:]] — любой цифровой символ от 0 до 9 .
  • [[:upper:]] — алфавитные символы в верхнем регистре — A-Z .
  • [[:lower:]] — алфавитные символы в нижнем регистре — a-z .
  • [[:print:]] — соответствует любому печатаемому символу.
  • [[:punct:]] — соответствует знакам препинания.
  • [[:space:]] — пробельные символы, в частности — пробел, знак табуляции, символы NL , FF , VT , CR .

Использовать специальные классы в шаблонах можно так:

$ echo «abc» | awk «/[[:alpha:]]/{print $0}» $ echo «abc» | awk «/[[:digit:]]/{print $0}» $ echo «abc123» | awk «/[[:digit:]]/{print $0}»

Специальные классы символов в регулярных выражениях

Символ «звёздочка»

Если в шаблоне после символа поместить звёздочку, это будет означать, что регулярное выражение сработает, если символ появляется в строке любое количество раз — включая и ситуацию, когда символ в строке отсутствует.

$ echo «test» | awk «/tes*t/{print $0}» $ echo «tessst» | awk «/tes*t/{print $0}»

Использование символа * в регулярных выражениях

Этот шаблонный символ обычно используют для работы со словами, в которых постоянно встречаются опечатки, или для слов, допускающих разные варианты корректного написания:

$ echo «I like green color» | awk «/colou*r/{print $0}» $ echo «I like green colour » | awk «/colou*r/{print $0}»

Поиск слова, имеющего разные варианты написания

В этом примере одно и то же регулярное выражение реагирует и на слово «color», и на слово «colour». Это так благодаря тому, что символ «u», после которого стоит звёздочка, может либо отсутствовать, либо встречаться несколько раз подряд.

Ещё одна полезная возможность, вытекающая из особенностей символа звёздочки, заключается в комбинировании его с точкой. Такая комбинация позволяет регулярному выражению реагировать на любое количество любых символов:

$ awk «/this. *test/{print $0}» myfile

Шаблон, реагирующий на любое количество любых символов

В данном случае неважно сколько и каких символов находится между словами «this» и «test».

Звёздочку можно использовать и с классами символов:

$ echo «st» | awk «/s*t/{print $0}» $ echo «sat» | awk «/s*t/{print $0}» $ echo «set» | awk «/s*t/{print $0}»

Использование звёздочки с классами символов

Во всех трёх примерах регулярное выражение срабатывает, так как звёздочка после класса символов означает, что если будет найдено любое количество символов «a» или «e», а также если их найти не удастся, строка будет соответствовать заданному шаблону.

Регулярные выражения POSIX ERE

Шаблоны стандарта POSIX ERE, которые поддерживают некоторые утилиты Linux, могут содержать дополнительные символы. Как уже было сказано, awk поддерживает этот стандарт, а вот sed — нет.

Тут мы рассмотрим наиболее часто используемые в ERE-шаблонах символы, которые пригодятся вам при создании собственных регулярных выражений.

▍Вопросительный знак

Вопросительный знак указывает на то, что предшествующий символ может встретиться в тексте один раз или не встретиться вовсе. Этот символ — один из метасимволов повторений. Вот несколько примеров:

$ echo «tet» | awk «/tes?t/{print $0}» $ echo «test» | awk «/tes?t/{print $0}» $ echo «tesst» | awk «/tes?t/{print $0}»

Вопросительный знак в регулярных выражениях

Как видно, в третьем случае буква «s» встречается дважды, поэтому на слово «tesst» регулярное выражение не реагирует.

Вопросительный знак можно использовать и с классами символов:

$ echo «tst» | awk «/t?st/{print $0}» $ echo «test» | awk «/t?st/{print $0}» $ echo «tast» | awk «/t?st/{print $0}» $ echo «taest» | awk «/t?st/{print $0}» $ echo «teest» | awk «/t?st/{print $0}»

Вопросительный знак и классы символов

Если символов из класса в строке нет, или один из них встречается один раз, регулярное выражение срабатывает, однако стоит в слове появиться двум символам и система уже не находит в тексте соответствия шаблону.

▍Символ «плюс»

Символ «плюс» в шаблоне указывает на то, что регулярное выражение обнаружит искомое в том случае, если предшествующий символ встретится в тексте один или более раз. При этом на отсутствие символа такая конструкция реагировать не будет:

$ echo «test» | awk «/te+st/{print $0}» $ echo «teest» | awk «/te+st/{print $0}» $ echo «tst» | awk «/te+st/{print $0}»

Символ «плюс» в регулярных выражениях

В данном примере, если символа «e» в слове нет, движок регулярных выражений не найдёт в тексте соответствий шаблону. Символ «плюс» работает и с классами символов — этим он похож на звёздочку и вопросительный знак:

$ echo «tst» | awk «/t+st/{print $0}» $ echo «test» | awk «/t+st/{print $0}» $ echo «teast» | awk «/t+st/{print $0}» $ echo «teeast» | awk «/t+st/{print $0}»

Знак «плюс» и классы символов

В данном случае если в строке имеется любой символ из класса, текст будет сочтён соответствующим шаблону.

▍Фигурные скобки

Фигурные скобки, которыми можно пользоваться в ERE-шаблонах, похожи на символы, рассмотренные выше, но они позволяют точнее задавать необходимое число вхождений предшествующего им символа. Указывать ограничение можно в двух форматах:

  • n — число, задающее точное число искомых вхождений
  • n, m — два числа, которые трактуются так: «как минимум n раз, но не больше чем m».

Вот примеры первого варианта:

$ echo «tst» | awk «/te{1}st/{print $0}» $ echo «test» | awk «/te{1}st/{print $0}»

Фигурные скобки в шаблонах, поиск точного числа вхождений

В старых версиях awk нужно было использовать ключ командной строки —re-interval для того, чтобы программа распознавала интервалы в регулярных выражениях, но в новых версиях этого делать не нужно.

$ echo «tst» | awk «/te{1,2}st/{print $0}» $ echo «test» | awk «/te{1,2}st/{print $0}» $ echo «teest» | awk «/te{1,2}st/{print $0}» $ echo «teeest» | awk «/te{1,2}st/{print $0}»

Интервал, заданный в фигурных скобках

В данном примере символ «e» должен встретиться в строке 1 или 2 раза, тогда регулярное выражение отреагирует на текст.

Фигурные скобки можно применять и с классами символов. Тут действуют уже знакомые вам принципы:

$ echo «tst» | awk «/t{1,2}st/{print $0}» $ echo «test» | awk «/t{1,2}st/{print $0}» $ echo «teest» | awk «/t{1,2}st/{print $0}» $ echo «teeast» | awk «/t{1,2}st/{print $0}»

Фигурные скобки и классы символов

Шаблон отреагирует на текст в том случае, если в нём один или два раза встретится символ «a» или символ «e».

▍Символ логического «или»

Символ | — вертикальная черта, означает в регулярных выражениях логическое «или». Обрабатывая регулярное выражение, содержащее несколько фрагментов, разделённых таким знаком, движок сочтёт анализируемый текст подходящим в том случае, если он будет соответствовать любому из фрагментов. Вот пример:

$ echo «This is a test» | awk «/test|exam/{print $0}» $ echo «This is an exam» | awk «/test|exam/{print $0}» $ echo «This is something else» | awk «/test|exam/{print $0}»

Логическое «или» в регулярных выражениях

В данном примере регулярное выражение настроено на поиск в тексте слов «test» или «exam». Обратите внимание на то, что между фрагментами шаблона и разделяющим их символом | не должно быть пробелов.

Фрагменты регулярных выражений можно группировать, пользуясь круглыми скобками. Если сгруппировать некую последовательность символов, она будет восприниматься системой как обычный символ. То есть, например, к ней можно будет применить метасимволы повторений. Вот как это выглядит:

$ echo «Like» | awk «/Like(Geeks)?/{print $0}» $ echo «LikeGeeks» | awk «/Like(Geeks)?/{print $0}»

Группировка фрагментов регулярных выражений

В данных примерах слово «Geeks» заключено в круглые скобки, после этой конструкции идёт знак вопроса. Напомним, что вопросительный знак означает «0 или 1 повторение», в результате регулярное выражение отреагирует и на строку «Like», и на строку «LikeGeeks».

Практические примеры

После того, как мы разобрали основы регулярных выражений, пришло время сделать с их помощью что-нибудь полезное.

▍Подсчёт количества файлов

Напишем bash-скрипт, который подсчитывает файлы, находящиеся в директориях, которые записаны в переменную окружения PATH . Для того, чтобы это сделать, понадобится, для начала, сформировать список путей к директориям. Сделаем это с помощью sed, заменив двоеточия на пробелы:

$ echo $PATH | sed «s/:/ /g»
Команда замены поддерживает регулярные выражения в качестве шаблонов для поиска текста. В данном случае всё предельно просто, ищем мы символ двоеточия, но никто не мешает использовать здесь и что-нибудь другое — всё зависит от конкретной задачи.
Теперь надо пройтись по полученному списку в цикле и выполнить там необходимые для подсчёта количества файлов действия. Общая схема скрипта будет такой:

Mypath=$(echo $PATH | sed «s/:/ /g») for directory in $mypath do done
Теперь напишем полный текст скрипта, воспользовавшись командой ls для получения сведений о количестве файлов в каждой из директорий:

#!/bin/bash mypath=$(echo $PATH | sed «s/:/ /g») count=0 for directory in $mypath do check=$(ls $directory) for item in $check do count=$[ $count + 1 ] done echo «$directory — $count» count=0 done
При запуске скрипта может оказаться, что некоторых директорий из PATH не существует, однако, это не помешает ему посчитать файлы в существующих директориях.

Подсчёт файлов

Главная ценность этого примера заключается в том, что пользуясь тем же подходом, можно решать и куда более сложные задачи. Какие именно — зависит от ваших потребностей.

▍Проверка адресов электронной почты

Существуют веб-сайты с огромными коллекциями регулярных выражений, которые позволяют проверять адреса электронной почты, телефонные номера, и так далее. Однако, одно дело — взять готовое, и совсем другое — создать что-то самому. Поэтому напишем регулярное выражение для проверки адресов электронной почты. Начнём с анализа исходных данных. Вот, например, некий адрес:

[email protected]
Имя пользователя, username , может состоять из алфавитно-цифровых и некоторых других символов. А именно, это точка, тире, символ подчёркивания, знак «плюс». За именем пользователя следует знак @.

Вооружившись этими знаниями, начнём сборку регулярного выражения с его левой части, которая служит для проверки имени пользователя. (+)@(+)\.({2,5})$/{print $0}»

Проверка адреса электронной почты с помощью регулярных выражений

То, что переданный awk текст выводится на экран, означает, что система распознала в нём адрес электронной почты.

Итоги

Если регулярное выражение для проверки адресов электронной почты, которое встретилось вам в самом начале статьи, казалось тогда совершенно непонятным, надеемся, сейчас оно уже не выглядит бессмысленным набором символов. Если это действительно так — значит данный материал выполнил своё предназначение. На самом деле, регулярные выражения — это тема, которой можно заниматься всю жизнь, но даже то немногое, что мы разобрали, уже способно помочь вам в написании скриптов, которые довольно продвинуто обрабатывают тексты.

В этой серии материалов мы обычно показывали очень простые примеры bash-скриптов, которые состояли буквально из нескольких строк. В следующий раз рассмотрим кое-что более масштабное.

Уважаемые читатели! А вы пользуетесь регулярными выражениями при обработке текстов в сценариях командной строки?

Одна из наиболее полезных и многофункциональных команд в терминале Linux – команда «grep». Grep – это акроним, который расшифровывается как «global regular expression print» (то есть, «искать везде соответствующие регулярному выражению строки и выводить их»). Это значит, что grep можно использовать для того, чтобы просмотреть, соответствуют ли вводимые данные заданным шаблонам.

Эта на первый взгляд тривиальная программа очень мощна при верном использовании. Ее способность сортировать вводимые данные на основе сложных правил делает ее популярной связкой во многих цепях команд.

Данное руководство рассматривает некоторые возможности команды grep, а затем переходит к использованию регулярных выражений. Все описанные в данном руководстве техники можно применить в управлении виртуальным сервером.

Основы использования

В простейшей форме grep используется для поиска совпадений буквенных шаблонов в текстовом файле. Это значит, что если команда grep получает слово для поиска, она будет выводить каждую содержащую это слово строку файла.

В качестве примера можно использовать grep для поиска строк, содержащих слово «GNU» в версии 3 GNU General Public License на системе Ubuntu.

cd /usr/share/common-licenses
grep «GNU» GPL-3
GNU GENERAL PUBLIC LICENSE

13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single

Первый аргумент, «GNU», является искомым шаблоном, а второй аргумент, «GPL-3», является входным файлом, который нужно найти.

В результате будут выведены все строки, содержащие текстовый шаблон. В некоторых дистрибутивах Linux искомый шаблон будет выделен в выведенных строках.

Общие опции

По умолчанию команда grep просто ищет строго указанные шаблоны во входном файле и выводит найденные строки. Тем не менее, поведение утилиты grep можно изменить, внеся некоторые дополнительные флаги.

При необходимости игнорировать регистр параметра поиска и искать как прописные, так и строчные вариации шаблона, можно использовать утилиты «-i» или «—ignore-case».

Для примера можно использовать grep для поиска в том же файле слова «license», написанного верхним, нижним или смешанным регистром.

grep -i «license» GPL-3
GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to

«This License» refers to version 3 of the GNU General Public License.
«The Program» refers to any copyrightable work licensed under this

Как можно видеть, выведенные результаты содержат «LICENSE», «license», and «License». Если бы в файле был экземпляр «LiCeNsE», он также был бы выведен.
При необходимости найти все строки, которые не содержат указанный шаблон, можно использовать флаги «-v» или «—invert-match».

Для примера можно применить следующую команду для поиска в лицензии BSD всех строк, которые не содержат слово «the»:

grep -v «the» BSD
All rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS «AS IS»» AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

Как можно видеть, последние две строки были выведены как не содержащие слова «the», поскольку команда «ignore case» не была использована.

Всегда полезно знать номера строк, в которых были обнаружены совпадения. Их можно узнать при помощи флагов «-n» или «—line-number» .

Если применить данный флаг в предыдущем примере, будет выведен следующий результат:

grep -vn «the» BSD
2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS «AS IS»» AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

Теперь можно сослаться на номер строки при необходимости внести изменения в каждой строке, которая не содержит «the».

Регулярные выражения

Как было сказано во вступлении, grep расшифровывается как «global regular expression print». Регулярное выражение – это текстовая строка, которая описывает определенный шаблон поиска.

Разные приложения и языки программирования применяют регулярные выражения немного по-разному. В данном руководстве рассматривается только небольшое подмножество способов описания шаблонов для Grep.

Буквенные совпадения

В приведенных выше примерах поиска слов «GNU» и «the» разыскивались очень простые регулярные выражения, точно соответствующие строке символов «GNU» и «the». GNU» GPL-3
GNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published

Аналогично, анкор «$» можно использовать после буквенной строки, чтобы указать, что совпадение действительно, только если искомая строка символов находится в конце текстовой строки.

В следующем регулярном выражении выведены только те строки, которые содержат «and» в конце:

grep «and$» GPL-3
that there is no warranty for this free software. For both users» and
The precise terms and conditions for copying, distribution and

alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and

Совпадение любого символа

Точка (. ) используется в регулярных выражениях, чтобы обозначить, что в указанном месте может находиться любой символ.

К примеру, при необходимости найти совпадения, содержащие два символа и затем последовательность «cept», нужно использовать следующий шаблон:

grep «..cept» GPL-3
use, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the

form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.

Как можно видеть, в результатах выведены слова «accept» and «except», а также вариации этих слов. Шаблон также совпал бы с последовательностью «z2cept», если бы такая была в тексте.

Выражения в скобках

Поместив группу символов в квадратные скобки («»), можно указать, что в данной позиции может находиться любой из взятых в скобки символов. [[:upper:]]» GPL-3
GNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as «you». «Licensees» and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a

Шаблон повторения (0 или больше раз)

Одним из наиболее часто используемых метасимволов является символ «*», что означает «повторить предыдущий символ или выражение 0 или больше раз».

К примеру, при необходимости найти каждую строку с открывающимися или закрывающимися круглыми скобками, что содержат только буквы и одиночные пробелы между ними, можно использовать следующее выражение:

grep «(*)» GPL-3

distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
. .*\.$» GPL-3
Source.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.

Расширенные регулярные выражения

Команду Grep можно также использовать с расширенным языком регулярных выражений при помощи флага «-E» или же вызывая команду «egrep» вместо «grep».

Эти команды открывают возможности «расширенных регулярных выражений». Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для выражения более сложных совпадений.

Группирование

Одна из простейших и полезнейших возможностей, которые открывают расширенные регулярные выражения, — это возможность группировать выражения и использовать их как единое целое.

Для группирования выражений используются круглые скобки. При необходимости использовать круглые скобки вне расширенных регулярных выражений, их можно «избежать» при помощи обратной косой

grep «\(grouping\)» file. txt
grep -E «(grouping)» file.txt
egrep «(grouping)» file.txt

Приведенные выше выражения являются эквивалентами.

Чередование

Подобно тому, как квадратные скобки задают различные возможные варианты совпадения одного символа, чередование позволяет указать альтернативные совпадения для строк символов или наборов выражений.

Для обозначения чередования используется символ вертикальной черты «|». Чередование часто применяется в группировании для того, чтобы указать, что один из двух или более возможных вариантов должен рассматриваться как совпадение.

В данном примере нужно найти «GPL» или «General Public License»:

grep -E «(GPL|General Public License)» GPL-3
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers» and authors» protection, the GPL clearly explains
authors» sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
. ..

Чередование можно использовать для выбора между двумя и более вариантами; для этого нужно ввести остальные варианты в группу отбора, отделяя каждый при помощи символа вертикальной черты «|».

Кванторы

В расширенных регулярных выражениях существуют метасимволы, указывающие частоту повторения символа, подобно тому, как метасимвол «*» указывает на совпадения предыдущего символа или строки символов 0 или более раз.

Чтобы указать совпадение символа 0 или больше раз, можно использовать символ «?». Он сделает предыдущий символ или ряд символов, по сути, необязательными.

В данном примере при помощи внесения последовательности «copy» в факультативную группу выведены совпадения «copyright» и «right»:

grep -E «(copy)?right» GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
«Copyright» also means copyright-like laws that apply to other kinds of
. [:space:]]+» GPL-3
The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for

freedoms that you received. You must make sure that they, too, receive
protecting users» freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.

Количество повторений совпадений

При необходимости указать количество повторения совпадений можно использовать фигурные скобки («{ }»). Эти символы используются для указания точного количества, диапазона, а также верхнего и нижнего предела количества совпадений выражения.

При необходимости найти все строки, что содержат сочетание трех гласных, можно использовать следующее выражение:

grep -E «{3}» GPL-3
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
При необходимости найти все слова, состоящие из 16-20 символов, используйте следующее выражение:
grep -E «[[:alpha:]]{16,20}» GPL-3
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or

Выводы

Во многих случаях команда grep бывает полезна для поиска шаблонов внутри файлов или в иерархии файловой системы. Она значительно экономит время, потому стоит ознакомиться с ее параметрами и синтаксисом.

Регулярные выражения еще более многофункциональны и могут быть использованы во многих популярных программах. К примеру, многие текстовые редакторы применяют регулярные выражения для поиска и замены текста.

Более того, передовые языки программирования используют регулярные выражения для выполнения процедур на конкретных фрагментах данных. Умение работать с регулярными выражениями пригодится при решении общих задач, связанных с компьютером.

Tags: ,

Регулярные выражения — это очень мощный инструмент для поиска текста по шаблону, обработки и изменения строк, который можно применять для решения множества задач. Вот основные из них:

  • Проверка ввода текста;
  • Поиск и замена текста в файле;
  • Пакетное переименование файлов;
  • Взаимодействие с сервисами, таким как Apache;
  • Проверка строки на соответствие шаблону.

Это далеко не полный список, регулярные выражения позволяют делать намного больше. Но для новых пользователей они могут показаться слишком сложными, поскольку для их формирования используется специальный язык. Но учитывая предоставляемые возможности, регулярные выражения Linux должен знать и уметь использовать каждый системный администратор.

В этой статье мы рассмотрим регулярные выражения bash для начинающих, чтобы вы смогли разобраться со всеми возможностями этого инструмента.

В регулярных выражениях могут использоваться два типа символов:

  • обычные буквы;
  • метасимволы.

Обычные символы — это буквы, цифры и знаки препинания, из которых состоят любые строки. Все тексты состоят из букв и вы можете использовать их в регулярных выражениях для поиска нужной позиции в тексте.

Метасимволы — это кое-что другое, именно они дают силу регулярным выражениям. С помощью метасимволов вы можете сделать намного больше чем поиск одного символа. Вы можете искать комбинации символов, использовать динамическое их количество и выбирать диапазоны. Все спецсимволы можно разделить на два типа, это символы замены, которые заменяют собой обычные символы, или операторы, которые указывают сколько раз может повторяться символ. Синтаксис регулярного выражения будет выглядеть таким образом:

обычный_символ спецсимвол_оператор

спецсимвол_замены спецсимвол_оператор

  • — с обратной косой черты начинаются буквенные спецсимволы, а также он используется если нужно использовать спецсимвол в виде какого-либо знака препинания;
  • ^ — указывает на начало строки;
  • $ — указывает на конец строки;
  • * — указывает, что предыдущий символ может повторяться 0 или больше раз;
  • + — указывает, что предыдущий символ должен повторится больше один или больше раз;
  • ? — предыдущий символ может встречаться ноль или один раз;
  • {n} — указывает сколько раз (n) нужно повторить предыдущий символ;
  • {N,n} — предыдущий символ может повторяться от N до n раз;
  • . a-z] — любой символ, которого нет в диапазоне;
  • b — обозначает границу слова с пробелом;
  • B — обозначает что символ должен быть внутри слова, например, ux совпадет с uxb или tuxedo, но не совпадет с Linux;
  • d — означает, что символ — цифра;
  • D — нецифровой символ;
  • n — символ перевода строки;
  • s — один из символов пробела, пробел, табуляция и так далее;
  • S — любой символ кроме пробела;
  • t — символ табуляции;
  • v — символ вертикальной табуляции;
  • w — любой буквенный символ, включая подчеркивание;
  • W — любой буквенный символ, кроме подчеркивания;
  • uXXX — символ Unicdoe.

Важно отметить, что перед буквенными спецсимволами нужно использовать косую черту, чтобы указать, что дальше идет спецсимвол. Правильно и обратное, если вы хотите использовать спецсимвол, который применяется без косой черты в качестве обычного символа, то вам придется добавить косую черту. w{3}:» /etc/passwd

Выводы

В этой статье мы рассмотрели регулярные выражения Linux, но это были только самые основы. Если копнуть чуть глубже, вы найдете что с помощью этого инструмента можно делать намного больше интересных вещей. Время, потраченное на освоение регулярных выражений, однозначно будет стоить того.

На завершение лекция от Яндекса про регулярные выражения:

Утилита grep — это очень мощное средство для поиска и фильтрации текстовой информации. В этой статье показаны несколько примеров ее использования, которые позволят по достоинству оценить ее возможности.
Основная сфера применения grep – поиск слов или фраз в файлах и потоках вывода. Вы можете осуществить поиск, набрав в командной строке запрос и область поиска (файл).
Например, чтобы найти строку “needle” в файле hystack.txt используйте следующую команду:

$ grep needle haystack.txt

В результате grep отобразит все вхождения needle, которые он встретит в содержимом файла haystack. txt. Важно заметить, что в этом случае grep ищет именно набор символов, а не слово. Например, будут отображены строки, включающие слово “needless” и другие слова, в которых встречается последовательность “needle”.

Чтобы указать grep, что вы ищете именно слово, используйте ключ -w. Этот ключ ограничит область поиска только указанным словом. Под словом подразумевается запрос, ограниченный с обоих сторон любыми пробельными символами, знаками пунктуации или переносами строки.

$ grep -w needle haystack.txt

Не обязательно ограничивать область поиска только одним файлом, grep может выполнять поиск и по группе файлов, причем в результатах поиска будет указан файл, в котором обнаружено совпадение. Ключ -n добавит еще и номер строки, в которой обнаружено совпадение, а ключ -r позволит выполнить рекурсивный поиск. Это очень удобно при поиске среди файлов с исходными текстами программ.

$ grep -rnw function_name /home/www/dev/myprogram/

Имя файла будет указано перед каждым совпадением. user_at_(home|work)» channel.log

С параметром -c grep выводит лишь количество найденных совпадений, а не сами совпадения. Строка поиска заключена в кавычки потому, что в ней содержатся специальные символы, которые могут распознаны оболочкой как управляющие. Обратите внимание, что кавычки не входят в шаблон поиска. Обратный слэш «» служит для экранирования служебных символов.
Выполним поиск по сообщениям людей, которые любят “кричать” в канале. Под “криком” мы понимаем сообщения, написанные в blondy-style, одними ЗАГЛАВНЫМИ буквами. Чтобы исключить из поиска случайные попадания аббревиатур, будем искать слова из пяти и более символов:

$ grep -w «+{5,}» channel.log

За более детальным описанием можно обратиться к странице руководства man grep.
Еще несколько примеров:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

Отображает строки из файла /etc/passwd, в которых есть строка root.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Отображаются, кроме того, номера строк, в которых есть искомая строка.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC user:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Проверяется, кто из пользователей не использует bash, исключая те аккаунты пользователей, у которых в качестве оболочки указан nologin.

# grep -c false /etc/passwd 7

Подсчитывает количество учетных записей, в которых в качестве командной оболочки указано /bin/false.

# grep -i games ~/.bash* | grep -v history

В этой команде отображаются строки из всех файлов домашнего каталога текущего пользователя, имена которых начинаются с ~/. », то оно соответствует любому символу, который ОТСУТСВУЕТ в списке. Например, регулярное выражение «» соответствует любой одиночной цифре.

Внутри выражения в квадратных скобках можно указывать диапазон, состоящий из двух символов, разделенных дефисом. Тогда выражение соответствует любому одиночному, который согласно правилам сортировки попадает внутрь этих двух символов, включая и эти два символа; при этом учитывается последовательность упорядочивания и набор символов, указанные в локали. Например, когда по умолчанию указана локаль C, выражение «» эквивалентно выражению «». Есть много локалей, в которых сортировка выполняется в словарном порядке, и в этих локалях «», как правило, не эквивалентно «», в них, например, оно может быть эквивалентно выражению «». Чтобы использовать традиционную интерпретацию выражения, указываемого в квадратных скобках, вы можете воспользоваться локалью C, установив для этого в переменной окружения LC_ALL значение «C».

Наконец, есть определенным образом поименованные символьные классы, которые указываются внутри выражений в квадратных скобках. Дополнительную информацию об этих предопределенных выражениях смотрите на страницах man или в документации команды grep.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: nobody:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

В примере отображаются все строки, содержащие либо символ «y», либо символ «f».
Универсальные символы (метасимволы)

Используйте «.» для поиска соответствия любому одиночному символу. Если вы хотите получить список всех английских слов, взятых из словаря, содержащих пять символов, начинающихся с «c» и заканчивающихся «h» (удобно для решения кроссвордов):

# grep «» /usr/share/dict/words catch clash cloth coach couch cough crash crush

Если вы хотите отобразить строки, в которых есть символ точки в виде литерала, то укажите в команде grep параметр -F. Символы «» означают наличие пустой строки до и соответственно после указанных букв. Это значит, что слова в файл words должны быть записаны соответствующим образом. Если вы хотите найти все слова в тексте по указанному шаблоны без учета пустых строк опустите символы «», для более точного поиска только слов используйте ключ -w.

Чтобы подобным образом найти слова, в которых между «c» и «h» может находиться любое число символов, используйте звездочку (*). В приведенном ниже примере из системного словаря выбираются все слова, начинающиеся с «c» и заканчивающиеся символом «h»:

# grep «» /usr/share/dict/words caliph cash catch cheesecloth cheetah —output omitted—

Если вы хотите найти в файле или в выходном потоке литеральный символ «звездочка», используйте для этого одинарные кавычки. Пользователь в приведенном ниже примере сначала пытается в файле /etc/profile найти «звездочку» без использования кавычек, в результате чего ничего не находится. Когда используются кавычки, в выходной поток выдается результат:

# grep * /etc/profile # grep «*» /etc/profile for i in /etc/profile.d/*.sh ; do

Тематические материалы:

Ошибка «Запрещено администратором или политикой шифрования в Android Почему не отключается блокировка экрана Приложение Плей Маркет остановлено – что делать Как исправить ошибку «Приложение Google остановлено» на Android? Ошибка «Запрещено администратором или политикой шифрования в Android Что такое отключено администратором политикой шифрования Полное руководство по разблокировке телефона LG Как открыть заблокированный телефон lg Полное руководство по разблокировке телефона LG Как снимает пароль лджи 0168 Устранение ошибки «Приложение Сервисы Google Play остановлено» на Android Скачать red call русская версия 7

Обновлено: 28. 01.2021

103583

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Базовые и расширенные регулярные выражения POSIX

POSIX или «интерфейс переносимой операционной системы для uniX» — это набор стандартов, определяющих некоторые функции, которые должна поддерживать операционная система (UNIX). Один из этих стандартов определяет два вида регулярных выражений. Команды, включающие регулярные выражения, такие как grep и egrep, реализуют эти варианты в POSIX-совместимых системах UNIX. Некоторые системы баз данных также используют регулярные выражения POSIX.

Вариант Basic Regular Expressions или BRE стандартизирует вариант, аналогичный тому, который используется традиционной командой UNIX grep. Это в значительной степени старейший вариант регулярных выражений, который все еще используется сегодня. Одна вещь, которая отличает эту разновидность, заключается в том, что большинству метасимволов требуется обратная косая черта, чтобы придать метасимволу свой вкус. Большинство других разновидностей, включая POSIX ERE, используют обратную косую черту для подавления значения метасимволов. Использование обратной косой черты для экранирования символа, который никогда не является метасимволом, является ошибкой.

BRE поддерживает выражения в квадратных скобках POSIX, которые аналогичны классам символов в других разновидностях регулярных выражений, но с некоторыми особенностями. Сокращения не поддерживаются. Другими функциями, использующими обычные метасимволы, являются точка, соответствующая любому символу, кроме разрыва строки, знак вставки и доллар, соответствующие началу и концу строки, и звезда, чтобы повторять токен ноль или более раз. Чтобы буквально сопоставить любой из этих символов, экранируйте их обратной косой чертой.

Другие метасимволы BRE требуют обратной косой черты, чтобы придать им особое значение. Причина в том, что самые старые версии UNIX grep их не поддерживали. Разработчики grep хотели сохранить совместимость с существующими регулярными выражениями, которые могут использовать эти символы как литеральные. BRE a{1,2} буквально соответствует a{1,2}, а a\{1,2\} соответствует a или aa. Некоторые реализации поддерживают \? и \+ в качестве альтернативы \{0,1\} и \{1,\}, но \? и \+ не являются частью стандарта POSIX. Токены могут быть сгруппированы с помощью \( и \). Обратные ссылки — это обычные от \1 до \9.. Допускается только до 9 групп. Например. \(ab\)\1 соответствует abab, а (ab)\1 недействителен, так как нет группы захвата, соответствующей обратной ссылке \1. Используйте \\1 для буквального соответствия \1.

POSIX BRE не поддерживает никаких других функций. Даже чередование не поддерживается.

Расширенные регулярные выражения POSIX

Вариант расширенных регулярных выражений или ERE стандартизирует вариант, аналогичный тому, который используется командой UNIX egrep. «Расширенный» относится к оригинальному grep UNIX, в котором были только скобочные выражения, точка, знак вставки, доллар и звезда. ERE поддерживает их так же, как BRE. Большинство современных разновидностей регулярных выражений являются расширениями разновидности ERE. По сегодняшним меркам вариант POSIX ERE довольно прост. Стандарт POSIX был определен в 1986, и с тех пор регулярные выражения прошли долгий путь.

Разработчики egrep не пытались поддерживать совместимость с grep, вместо этого создали отдельный инструмент. Таким образом, egrep и POSIX ERE добавляют дополнительные метасимволы без обратной косой черты. Вы можете использовать обратную косую черту, чтобы подавить значение всех метасимволов, как и в современных вариантах регулярных выражений. Экранирование символа, который не является метасимволом, является ошибкой.

Квантификаторы ?, +, {n}, {n,m} и {n,} повторяют предыдущий токен ноль или один раз, один или более раз, n раз, от n до m раз и n или более раз соответственно . Чередование поддерживается через обычную вертикальную черту |. Незакрашенные круглые скобки создают группу, например. (abc){2} соответствует abcabc. Стандарт POSIX не определяет обратные ссылки. Некоторые реализации поддерживают от \1 до \9., но они не являются частью стандарта для ERE. ERE — это расширение старого grep UNIX, а не POSIX BRE.

Именно так далеко идет расширение.

Чередование POSIX ERE возвращает самое длинное совпадение

В разделе руководства о чередовании я объяснил, что механизм регулярных выражений остановится, как только найдет совпадающую альтернативу. Однако стандарт POSIX требует, чтобы возвращалось самое длинное совпадение. При применении Set|SetValue к SetValue механизм регулярных выражений, совместимый с POSIX, будет полностью соответствовать SetValue. Даже если механизм является механизмом NFA, ориентированным на регулярные выражения, POSIX требует, чтобы он имитировал сопоставление DFA, ориентированное на текст, пробуя все альтернативы и возвращая самое длинное совпадение, в данном случае SetValue. Традиционный движок NFA будет соответствовать Set, как и все другие разновидности регулярных выражений, обсуждаемые на этом веб-сайте.

Механизм, совместимый с POSIX, все равно найдет самое левое совпадение. Если вы примените Set|SetValue к Set или SetValue один раз, оно будет соответствовать Set. Первая позиция в строке — это крайняя левая позиция, в которой наше регулярное выражение может найти действительное совпадение. Тот факт, что дальше в строке можно найти более длинное совпадение, не имеет значения. Если вы примените регулярное выражение во второй раз, продолжая с первого пробела в строке, тогда будет совпадать SetValue. Традиционный механизм NFA будет сопоставлять Set в начале строки в качестве первого совпадения и Set в начале 3-го слова в строке в качестве второго совпадения.

| Быстрый старт | Учебник | Инструменты и языки | Примеры | Ссылка | Обзоры книг |

| грэп | PowerGREP | Регулярное выражение друг | RegexMagic |

| EditPad Lite | EditPad Pro |

| Повышение | Дельфы | GNU (Linux) | Отличный | Ява | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Перл | PHP | POSIX | PowerShell | Питон | Р | Руби | std::regex | Tcl | VBScript | Visual Basic 6 | wxвиджеты | XML-схема | Ходжо | XQuery и XPath | XRegExp |

| MySQL | Оракул | PostgreSQL |

Операторы POSIX — Amazon Redshift

Регулярные выражения POSIX предоставляют более мощные средства для сопоставления с образцом чем операторы LIKE и SIMILAR TO. POSIX шаблоны регулярных выражений могут соответствовать любой части строки, в отличие от ПОХОЖИХ Оператор TO, который возвращает true только в том случае, если его шаблон соответствует всему нить.

Примечание

Сопоставление регулярных выражений с использованием операторов POSIX вычисляется дорогой. Мы рекомендуем использовать LIKE, когда это возможно, особенно когда обработка очень большого количества строк. Например, следующие запросы функционально идентичны, но запрос, использующий LIKE, выполняется несколько раз быстрее, чем запрос, использующий регулярное выражение:

 выберите количество(*) из события, где имя_события ~ '.*(Кольцо|Умереть).*';
выберите count(*) из события, где имя события LIKE '%Ring%' ИЛИ ​​имя события LIKE '%Die%'; 

Синтаксис

  выражение  [ ! ] ~  шаблон  

Аргументы

выражение

Допустимое символьное выражение UTF-8, например имя столбца.

!

Оператор отрицания.

~

Выполнить сопоставление с учетом регистра для любой подстроки выражение .

узор

Строковый литерал, представляющий стандартное регулярное выражение SQL. шаблон.

Если шаблон не содержит подстановочных знаков, то шаблон представляет только саму строку.

Для поиска строк, содержащих метасимволы, например ‘ . * | ? ‘и т. д. экранируйте символ, используя две обратные косые черты (‘ \‘). В отличие от ПОДОБНО и ПОДОБНО , POSIX синтаксис регулярного выражения не поддерживает определяемый пользователем escape-символ.

Любое из символьных выражений может иметь тип данных CHAR или VARCHAR. Если они отличаются, Amazon Redshift преобразует 9шаблон 0051 к типу данных выражение .

Все символьные выражения могут быть типами данных CHAR или VARCHAR. Если выражения различаются по типу данных, Amazon Redshift преобразует их в тип данных выражение .

Сопоставление с образцом POSIX поддерживает следующие метасимволы:

POSIX Описание
. Соответствует любому одиночному символу.
* Соответствует нулю или более вхождений.
+ Соответствует одному или нескольким вхождениям.
? 9009 Соответствует символу начала строки.
$ Соответствует символу конца строки.
$ Совпадает с концом строки.
[ ] Скобки указывают список соответствия, который должен соответствует одному выражению в списке. Каре ( 9 ) предшествует несоответствующий список, который соответствует любому символу, кроме выражения, представленные в списке.
( ) Скобки группируют элементы в один логический вещь.
{м} Точно повторить предыдущий элемент м раза.
{м,} Повторить предыдущий пункт m или более раз.
{м,н} Повторить предыдущий элемент как минимум м и не более n раз.
[: :] Соответствует любому символу в пределах символа POSIX. учебный класс. В следующих классах символов Amazon Redshift поддерживает только Символы ASCII: [:alnum:] , [:alpha:] , [:нижний:] , [:верхний:]

Amazon Redshift поддерживает следующие классы символов POSIX.

Класс символов Описание
[[:alnum:]] Все буквенно-цифровые символы ASCII
[[:альфа:]] Все алфавитные символы ASCII
[[:пусто:]] Все символы пробела
[[:управление:]] Все управляющие символы (непечатаемые)
[[:цифра:]] Все числовые цифры
[[:нижний:]] Все буквы ASCII в нижнем регистре символы
[[:пункт:]] Все знаки пунктуации
[[:пробел:]] Все символы пробела (непечатаемые)
[[:верхний:]] Все буквы ASCII в верхнем регистре символы
[[:xdigit:]] Все допустимые шестнадцатеричные символы

Amazon Redshift поддерживает следующие операторы Perl в обычных выражения. Экранируйте оператор, используя две обратные косые черты (‘ \’).

9[:пробел:]]
Оператор Описание Эквивалентное выражение класса символов
Цифровой символ [[:цифра:]]
\\Д

Примеры

В следующей таблице показаны примеры сопоставления шаблонов с использованием POSIX операторы:

Выражение Возвращает
'abc' ~ 'abc' Правда
'абв' ~ 'а' Правда
'abc' ~ 'A' Ложь
'abc' ~ '. *(b|d).*' Правда
'abc' ~ '(b|c).*' Правда
'AbcAbcdefgefg12efgefg12' ~ '((Ab)?c)+d((efg)+(12))+' Правда
'ааааааб11111xy' ~ 'а{6}.[1]{5}(х|у){2}' Правда
'$0,87' ~ '\\$[0-9]+(\\.[0-9][0-9])?' Правда
'ab c' ~ '[[:space:]]' Правда
'ab c' ~ '\\s' Правда
' ' ~ '\\S' Ложь

В следующем примере выполняется поиск городов, названия которых содержат E или H :

 ВЫБЕРИТЕ ОТЛИЧНЫЙ город ОТ пользователей
WHERE city ~ '. *E.*|.*H.*' ORDER BY city LIMIT 5;
      город
------------------
 Агура Хиллз
 Оберн-Хиллз
 Бентон-Харбор
 Беверли Хиллс
 Chicago Heights 

В следующем примере используется управляющая строка (‘ \\ ‘) для поиска для строк, содержащих точку.

 ВЫБЕРИТЕ название места проведения ИЗ места проведения
ГДЕ место проведения ~ '.*\\..*'
ЗАКАЗАТЬ ПО местонахождению;
          название места проведения
------------------------------
 Форум Сент-Пит Таймс
 Jobing.com Арена
 Хьюберт Х. Хамфри Метродоум
 Сотовая связь США
 Центр Superpages.com
 Э.Дж. Наттер Центр
 Театр Бернарда Б. Джейкобса
 Театр Сент-Джеймс 

Javascript отключен или недоступен в вашем браузере.

Чтобы использовать документацию Amazon Web Services, должен быть включен Javascript. Инструкции см. на страницах справки вашего браузера.

Условные обозначения документов

АНАЛОГИЧНО

Условия диапазона BETWEEN

Расширенные регулярные выражения POSIX для Oracle

 
  Советы по Oracle PL/SQL от Boobal Ganesan

Это отрывок из книги Advanced PL/SQL: The Definitive Reference by Boobal Ganesan.

POSIX или переносная операционная система Интерфейс для uniX — это набор стандартов, который определяет некоторые функциональности поддерживается операционной системой UNIX. Стандарт POSIX имеет три набора стандартов. BRE для базового уровня, ERE для расширенного и SRE для простых регулярных выражений. Самый современный обычный выражения являются расширениями ERE, а также Oracle регулярное выражение использует только эти стандарты.

 

Oracle не полностью поддерживает стандарт POSIX ERE. Стандарт POSIX утверждает, что это недопустима обратная ссылка на символ, который не является метасимвол. Oracle поддерживает это и просто игнорирует обратная косая черта. Например, строка б не является метасимвол, когда перед ним ставится префикс с обратной косой чертой \b , аналогично до буквального b . Это означает, что все POSIX ERE стандартизировали обычные выражения могут использоваться с Oracle, но не все обычные выражений, работа с Oracle может поддерживаться полностью Система с поддержкой POSIX ERE.

Метасимволы регулярных выражений в Oracle

Метасимволы аналогичны строковые литералы, но со специальным значением, которое используется для идентифицировать текстовый материал данного шаблона и обработайте его с помощью регулярных выражений. Темы ниже определяет различные операторы в Oracle.

POSIX Метасимволы в Oracle

Приведенный ниже список метасимволов поддерживает использование регулярных выражений, передаваемых в SQL условие регулярного выражения и функции. Эти метасимволы соответствуют стандарту POSIX.

Список метасимволов POSIX

Метасимвол

Описание

*

Соответствует нулю или более вхождений.

?

Соответствует нулю или одному вхождению.

+

Соответствует одному или нескольким вхождениям.

|

Соответствует любой из альтернатив. Это похоже оператору ИЛИ.

.

Соответствует любому символу в наборе символов базы данных за исключением Null и символа новой строки.

\

Любой метасимвол, за которым следует символ обратной косой черты обрабатывается как строковый литерал для его поиска. Использование двойного символа обратной косой черты (\\) обрабатывает символ обратную косую черту (\) как строковый литерал. 9

Соответствует символу в начале строки в строке по умолчанию. В многострочном режиме это соответствует началу любой строки в исходном коде нить.

$

Соответствует символу в конце строки в строка по умолчанию. В многострочном режиме он соответствует конец любой строки в исходной строке.

(…)

Это выражение группировки, которое обрабатывает выражение в скобках как группу. Этот может быть символьным литералом или выражением с операторы.

[…]

Это выражение соответствия, которое указывает список, который соответствует любому из совпадений, присутствующих в список из исходной строки. 9…]

Это несовпадающее выражение, которое указывает список, который не совпадает ни с одним из совпадений присутствует в списке из исходной строки.

[. Элемент .]

Это оператор сопоставления элементов в стандарте POSIX. стандарт. Этот оператор позволяет нам рассмотреть многосимвольный элемент сопоставления должен быть одним символом. За например, строка ч состоит из двух символов на английском языке, тогда как если язык Традиционный испанский определяется в locale, он будет рассматриваться как одиночный символ.

[[: Класс:]]

Соответствует любому символу, принадлежащему указанному класс персонажа. Например, класс [[:alpha:]] соответствует всем алфавитам в исходной строке. ниже таблица определяет все классы из POSIX стандарт.

Класс

Описание

[[:альнум:]]

Соответствует всем буквенно-цифровым символам.

[[:альфа:]]

Соответствует всем буквенным символам.

[[:пусто:]]

Соответствует всем символам пробела.

[[:кнтрл:]]

Соответствует всем непечатаемым управляющим символам.

[[:цифра:]]

Соответствует всем числовым цифрам.

[[:xdigit:]]

Соответствует всем шестнадцатеричным символам.

[[:пункт:]]

Соответствует всем знакам пунктуации.

[[:верхний:]]

Соответствует всем алфавитам верхнего регистра.

[[:ниже:]]

Соответствует всем алфавитам нижнего регистра.

[[:график:]]

Соответствует всем [[:punct:]], [[:upper:]], [[:lower:]] и [[:digit:]].

[[:печать:]]

Соответствует всем печатным символам.

[[:пробел:]]

Соответствует всем символам пробела, таким как каретка возвращаться, новая строка, подача формы и вертикальная вкладка.

[а-я]

Соответствует всем алфавитам нижнего регистра. Это похоже на [[:lower:]]. Чтобы соответствовать набору строчными буквами, укажите начало и конечный диапазон. Например, [a-m] соответствует любому меньшему регистр алфавита между диапазоном и и м в исходной строке .

[А-Я]

Соответствует всем алфавитам верхнего регистра. Это похоже на [[:upper:]]. Чтобы соответствовать набору буквы верхнего регистра, укажите начало и конечный диапазон. Например, [A-D] соответствует любому верхний регистр алфавит между диапазоном А и Д в исходной строке.

[0-9]

Соответствует всем числовым цифрам. Это похоже на [[:цифры:]]. Чтобы сопоставить набор цифр, указать начальный и конечный диапазон. Например, [0-5] соответствует цифрам в диапазоне 0 и 5 в исходной строке.

[А-За-z0-9]

Соответствует всем буквенно-цифровым символам. Это похоже на [[:alnum:]]. комбинация может быть изменена в соответствии с требование типа [A-Z0-9], [человек], [0-7a-oA-H] и т. д.

[=Класс=]

Это класс эквивалентности символов, соответствующий всем характеры одного и того же класса эквивалентности в текущая локаль. Например, выражение [=n=] ищет все символы в одном классе как N и ñ из исходной строки Эль-Ниньо в Испанская локация.

{м}

Совпадает ровно m раз.

{м,}

Соответствует не менее m раз.

{м, п}

Совпадает не менее m раз, но не более n раз.

 

Нужно научиться программировать на PL/SQL? Для полных заметок по программированию на PL/SQL мы порекомендовать книгу Advanced PL/SQL: The Definitive Reference by Boobal Ganesan.

Это полная книга по PL/SQL с все, что вам нужно знать, чтобы писать эффективно и сложный код PL/SQL.

Обучение Oracle от Дона Берлесона

Лучшее на сайте «Оракул Учебные классы» находятся на расстоянии одного телефонного звонка! Вы можете пройти индивидуальное обучение Oracle от Дональда Берлесона прямо в своем магазине!


 



 

Бурлесон — американская команда

Примечание: Этот оракул документация была создана в качестве справочника по поддержке и обучению Oracle для использования нашими Специалисты-консультанты по настройке производительности DBA. Не стесняйтесь задавать вопросы на нашем Форум Оракула.

Проверка опыт! Кто угодно следует рассмотреть возможность использования услуг эксперта службы поддержки Oracle. самостоятельно исследовать свои полномочия и опыт, а не полагаться на реклама и самопровозглашенная экспертиза. Все законные эксперты Oracle публиковать их оракул квалификации. 906:20

Опечатки? Технологии Oracle меняются, и мы стремиться обновлять нашу информацию о поддержке BC Oracle. Если вы нашли ошибку или у вас есть предложение по улучшению нашего контента, мы будем признательны за ваше Обратная связь. Просто Эл. адрес:

и укажите URL-адрес страницы.



Бурлесон Консалтинг

Оракул Поддержка базы данных

Оракул Настройка производительности

Удаленные службы баз данных


 

Авторские права © 1996 —  2020

Все права защищены Бурлесон

Оракул

® является зарегистрированным товарным знаком корпорации Oracle.

 

 

Расширенный синтаксис регулярных выражений POSIX

Расширенный синтаксис регулярных выражений POSIX

Хотя UTR-18 версии 6 предлагает использовать синтаксис шаблона, подобный Perl, поддержка регулярных выражений в модуле интернационализации использует расширенное регулярное выражение POSIX 2 (ERE). ) синтаксис шаблона с расширениями Unicode, предложенный UTR-18 версии 5.1. Этот синтаксис описан в таблице 2.

В RWURegularExpression используются следующие специальные символы:

Таблица 2. Специальные символы  RWURegularExpression на основе синтаксиса POSIX2;

Символ

Значение

+

Соответствует одному или нескольким вхождениям выражения в скобках. Например, a+ соответствует a, aa, aaa и так далее.

*

Соответствует нулю или более вхождений предыдущего элемента, за исключением выражения в квадратных скобках. Например, a* соответствует пустой строке, a, aa и так далее.

?

Соответствует нулю или одному вхождению предшествующего элемента, за исключением выражения в квадратных скобках. Например, а? соответствует пустой строке и a.

{ и }

Укажите диапазон мощности, сформированный следующим образом: {m,n}. Эта конструкция соответствует между m и n вхождениями предыдущего элемента. Например, a{2,3} соответствует aa и aaa.

Эта конструкция также может быть образована с использованием {m,} и {m}. Первый соответствует m или более экземплярам предыдущего элемента. Например, a{2,} соответствует aa, aaa, aaaa и так далее. Второй соответствует ровно m вхождениям предыдущего элемента. Например, a{2} соответствует aa.

Примечание: { обрабатывается по-разному в выражении в квадратных скобках. В этом контексте { обозначает начало категории символов Unicode, как описано в разделе Регулярные выражения Unicode.

[и]

Создайте выражение в квадратных скобках. Выражения в квадратных скобках создают набор элементов, любой из которых может быть сопоставлен. Например, [abc] соответствует a, или b, или c.

В выражении со скобками все специальные символы регулярных выражений обрабатываются как обычные неспециальные символы, за исключением::

— определяет диапазон значений символов на основе их битовой комбинации. Например, [A-Za-z] соответствует всем прописным и строчным английским символам. Для указания — как символ в скобочном выражении он должен быть первым или последним символом в наборе; например, [-a-z] или [A-Z-]. 9]abc].

( и )

Элементы регулярного выражения группируются в подвыражения, которые рассматриваются как единое целое. Например, тогда как ab* соответствует a, ab, abb и т. д., (ab)* соответствует пустой строке, ab, abab и т. д. ( и ) не рассматриваются как специальные символы внутри выражения в квадратных скобках.

\

Экранирует символ регулярного выражения, заставляя его рассматриваться как обычный символ. Например, тогда как (ab) указывает на подвыражение, состоящее из ab, \(ab\) обозначает последовательность символов (, a, b и ). 9обрабатывается по-разному в квадратных скобках.

$

Указывает, что регулярное выражение или подвыражение закреплено в конце входной строки. Например, ab$ соответствует ab и cab, но не abc.

|

Обозначает чередование или создание набора одинаково допустимых альтернативных выражений или подвыражений, каждое из которых может быть сопоставлено. Например, ab|cd соответствует ab или cd.

.

Соответствует любой единице кода, за исключением тех, которые указывают на логический конец строки, как указано в Техническом отчете Unicode № 18: \u2028, \u2029, \u000A, \u000B, \u000C, \u000D, \u0085 .

ПРИМЕЧАНИЕ. Все указанные выше специальные символы регулярных выражений считаются специальными, если они не экранированы. Это немного отличается от стандарта расширенных регулярных выражений POSIX, в котором некоторые символы рассматриваются как специальные при экранировании, а другие рассматриваются как специальные, если они не экранированы.

draft-fregly-regext-rdap-search-regex-03

 Инженерная рабочая группа Интернета А. Фрегли
Интернет-проект С. Шет
Предполагаемый статус: трек стандартов С. Холленбек
Срок действия: 6 июня 2018 г. Verisign Labs
                                                        3 декабря 2017 г.
  Поиск по протоколу доступа к регистрационным данным (RDAP) с использованием POSIX Regular
                              Выражения
                черновик-fregly-regext-rdap-search-regex-03
Абстрактный
   Протокол доступа к регистрационным данным (RDAP) обеспечивает ограниченный поиск
   функциональность, основанная на сопоставлении с образцом.  В этом документе описывается
   Расширение запроса RDAP, предоставляющее дополнительные функции поиска.
   с использованием расширенных регулярных выражений POSIX.
Статус этого меморандума
   Настоящий Интернет-проект представлен в полном соответствии с
   положения BCP 78 и BCP 79.
   Интернет-Черновики являются рабочими документами Интернет-Инженерии.
   Целевая группа (IETF). Обратите внимание, что другие группы также могут распространять
   рабочие документы в виде Internet-Drafts. Список актуальных интернет-
   Черновики находятся по адресу https://datatracker.ietf.org/drafts/current/.
   Интернет-проекты – это проекты документов, действительные не более шести месяцев.
   и могут быть обновлены, заменены или устаревшими другими документами в любое время.
   время. Неуместно использовать Internet-Drafts в качестве справочного материала.
   материал или цитировать их, кроме как «в процессе».
   Срок действия этого интернет-драфта истекает 6 июня 2018 года.
Уведомление об авторских правах
   Copyright (c) 2017 IETF Trust и лица, указанные в качестве
   авторы документа.  Все права защищены.
   Этот документ регулируется BCP 78 и юридическими документами IETF Trust.
   Положения, касающиеся документов IETF
   (https://trustee.ietf.org/license-info) действует на дату
   публикации этого документа. Пожалуйста, ознакомьтесь с этими документами
   внимательно, так как они описывают ваши права и ограничения в отношении
   к этому документу. Компоненты кода, извлеченные из этого документа, должны
   включить текст упрощенной лицензии BSD, как описано в Разделе 4.e
Фрегли и др. Истекает 6 июня 2018 г. [Страница 1] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   Доверительные юридические положения и предоставляются без гарантии, поскольку
   описан в Упрощенной лицензии BSD.
Оглавление
   1. Введение  . . . . . . . . . . . . . . . . . . . . . . . . 2
     1.1. Условные обозначения, используемые в этом документе. . . . . . . . . . . . 2
   2. Спецификация сегмента пути RDAP. . . . . . . . . . . . . . . 3
     2. 1. Поиск домена. . . . . . . . . . . . . . . . . . . . . . 3
     2.2. Поиск сервера имен. . . . . . . . . . . . . . . . . . . 5
     2.3. Поиск сущности. . . . . . . . . . . . . . . . . . . . . . 6
     2.4. Сегменты будущего пути. . . . . . . . . . . . . . . . . . 7
   3. Синтаксис шаблона поиска. . . . . . . . . . . . . . . . . . . . 7
   4. Обработка запросов. . . . . . . . . . . . . . . . . . . . . . 8
   5. Вопросы интернационализации. . . . . . . . . . . . . 96. Вопросы реализации. . . . . . . . . . . . . . . . 9
   7. Соображения IANA. . . . . . . . . . . . . . . . . . . . . 11
   8. Статус реализации. . . . . . . . . . . . . . . . . . . . 12
     8.1. Лаборатории ВериСайн. . . . . . . . . . . . . . . . . . . . . . 12
     8.2. Служба APNIC RDAP. . . . . . . . . . . . . . . . . . . 13
   9. Вопросы безопасности. . . . . . . . . . . . . . . . . . . 13
   10. Благодарности. . . . . . . . . . . . . . . . . . . . . . 14
   11. Ссылки. . . . . . . . . . . . . . . . . . . . . . . . . 14
     11. 1. Нормативные ссылки . . . . . . . . . . . . . . . . . . 14
     11.2. Информативные ссылки. . . . . . . . . . . . . . . . . 15
   Приложение A. Журнал изменений. . . . . . . . . . . . . . . . . . . . . 16
   Адреса авторов. . . . . . . . . . . . . . . . . . . . . . . 16
1. Введение
   Шаблоны поиска для протокола доступа к регистрационным данным (RDAP)
   поиск, как описано в RFC 7482 [RFC7482], ограничены. Протокол
   описанный в этой спецификации, расширяет возможности поиска RDAP за счет
   добавление сегментов пути для функций поиска RDAP с использованием сети RESTful
   сервис и POSIX [IEEE.1003.1_2013_EDITION] расширенный обычный
   выражения. Услуга реализована с помощью программы «Передача гипертекста».
   Протокол (HTTP) [RFC7230] и соглашения, описанные в RFC 7480.
   [RFC7480].
1.1. Условные обозначения, используемые в этом документе
   Ключевые слова «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ТРЕБУЕТСЯ», «ДОЛЖЕН», «НЕ ДОЛЖЕН»,
   "СЛЕДУЕТ", "НЕ СЛЕДУЕТ", "РЕКОМЕНДУЕТСЯ", "МОЖЕТ" и "ДОПОЛНИТЕЛЬНО" в этом
   документ следует интерпретировать, как описано в RFC 2119. [RFC2119].
Фрегли и др. Истекает 6 июня 2018 г. [Страница 2] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
2. Спецификация сегмента пути RDAP
   Сегменты пути, определенные в этом разделе, являются ДОПОЛНИТЕЛЬНЫМИ расширениями
   сегменты пути, определенные в RFC 7482 [RFC7482]. Путь типа ресурса
   сегменты для поиска:
   o «домены»: используется для идентификации поиска информации о доменном имени с использованием
      шаблон, соответствующий полному доменному имени.
   o 'nameservers': используется для идентификации поиска информации о сервере имен.
      использование шаблона для соответствия имени хоста.
   o 'entities': Используется для идентификации поиска информации об объекте с использованием
      шаблон для соответствия строковому идентификатору.
   Шаблоны поиска в сегментах пути ДОЛЖНЫ быть расширены POSIX.
   обычные выражения. ДОЛЖНЫ использоваться небезопасные для URL символы в шаблонах поиска.
   кодироваться в процентах.  Процентное кодирование ДОЛЖНО быть таким, как описано в разделе
   2.1 RFC 3986 [RFC3986]. Процентное кодирование устранит ошибки
   это может произойти из-за интерпретации веб-сервером или сервером приложений
   определенные небезопасные символы и устранит ошибки из-за
   несовместимая семантика кодирования и декодирования для определенных символов.
   Например, символ пробела может быть закодирован как «+», когда
   отправлено через HTML-форму и закодировано как "%20" при отправке
   через адресную строку веб-браузера. Подробные результаты можно
   полученный с использованием метода HTTP GET и указанных сегментов пути
   здесь.
   В этом документе определяется параметр запроса RDAP, «тип поиска», то есть
   используется для идентификации поисковых запросов, требующих специализированной обработки
   помимо ограниченной функциональности, описанной в RFC 7482 [RFC7482].
   Обработка поиска с использованием POSIX [IEEE.1003.1_2013_EDITION] расширена
   регулярные выражения указываются значением параметра строки запроса
   "regex", например.  "тип поиска = регулярное выражение". Другие формы поиска
   обработка возможна и может быть описана в других спецификациях
   используя другие значения параметра запроса searchtype. Видеть
   Раздел 2.4 для дополнительной информации.
2.1. Поиск домена
   Синтаксис: domains?name=<шаблон поиска домена>&searchtype=regex
   Синтаксис: domains?nsLdhName=<шаблон поиска домена>&searchtype=regex
   Синтаксис: domains?nsIp=<шаблон поиска домена>&searchtype=regex
   Поиск информации о домене по имени задается с помощью этого
   форма:
   домены?имя=XXXX&searchtype=regex
Фрегли и др. Истекает 6 июня 2018 г. [Страница 3] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то XXXX ДОЛЖЕН быть расширенным регулярным выражением POSIX. Не-
   Безопасные для URL символы в XXXX ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2. 1 RFC 3986 [RFC3986].
   Предоставленное регулярное выражение будет сопоставляться с доменами в
   пространство имен, администрируемое оператором сервера. Доменные имена такие
   определено RFC 5890 [RFC5890] в формате «буквы, цифры, дефис».
   Следующий URL-адрес будет использоваться для поиска информации о доменных именах.
   соответствие шаблону "e[a-z]ample\.com":
   https://example.com/rdap/domains?name=e%5Ba-
   z%5Dample%5C.com&searchtype=regex
   Интернационализированные доменные имена (IDN) в формате U-метки [RFC5890] могут
   также соответствовать расширенным шаблонам поиска регулярных выражений POSIX.
   Шаблоны поиска для этих имен имеют вид
   /domains?name=XXXX&searchtype=regex, где XXXX — это расширенный POSIX
   регулярное выражение. Небезопасные для URL-адреса символы в XXXX ДОЛЖНЫ быть процентами-
   закодировано. Процентное кодирование ДОЛЖНО быть таким, как описано в разделе 2.1 RFC.
   3986 [RFC3986]. Предоставленное регулярное выражение будет соответствовать
   против доменных имен в формате U-метки.  См. раздел 6.1 RFC 7482.
   [RFC7482] для информации, описывающей кодировку символов U-метки. Видеть
   Раздел 5 для других соображений относительно регулярных выражений
   соответствие IDN.
   Задан поиск информации о домене по имени сервера имен
   используя эту форму:
   домены?nsLdhName=YYYY&searchtype=regex
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то YYYY ДОЛЖЕН быть расширенным регулярным выражением POSIX. Не-
   Безопасные для URL символы в YYYY ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 39.86 [RFC3986].
   Предоставленное регулярное выражение будет сравниваться с именами хостов в
   пространство имен, администрируемое оператором сервера. Имена хостов такие
   определено RFC 5890 [RFC5890] в формате «буквы, цифры, дефис».
   Следующий URL-адрес будет использоваться для поиска доменов, делегированных
   DNS-серверы, соответствующие шаблону "ns[1-9]\.e[a-z]ample\.com":
   https://example. com/rdap/domains?nsLdhName=ns%5B1-9%5D%5C.e%5Ba-
   z%5Dample%5C.com&searchtype=regex
   Поиск информации о домене по IP-адресу сервера имен
   указывается с помощью этой формы:
   домены?nsIp=ZZZZ&searchtype=regex
Фрегли и др. Истекает 6 июня 2018 г. [Страница 4] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то ZZZZ ДОЛЖЕН быть расширенным регулярным выражением POSIX. Не-
   Безопасные для URL символы в ZZZZ ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 3986 [RFC3986].
   Предоставленное регулярное выражение будет сопоставлено с IPv4.
   адреса [RFC1166] и IPv6-адреса [RFC5952], связанные с
   определенные серверы имен. Следующий URL будет использоваться для поиска
   домены, которые были делегированы серверам имен, имеющим IP
   адреса, соответствующие "192\.0\.[1-9]\.0":
   https://example. com/rdap/
   домены?nsIp=192%5C.0%5C.%5B1-9%5D%5C.0&searchtype=regex
2.2. Поиск сервера имен
   Синтаксис: nameservers?name=<поиск серверов имен
   шаблон>&тип_поиска=регулярное выражение
   Синтаксис: nameservers?ip=<шаблон поиска сервера имен>&searchtype=regex
   Поиск информации о сервере имен по имени сервера имен
   указывается с помощью этой формы:
   серверы имен?name=XXXX&searchtype=regex
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то XXXX ДОЛЖЕН быть расширенным регулярным выражением POSIX. Не-
   Безопасные для URL символы в XXXX ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 39.86 [RFC3986].
   Предоставленное регулярное выражение будет сопоставлено с сервером имен.
   имена в пространстве имен, управляемом оператором сервера. Имя
   имена серверов определены в RFC 5890 [RFC5890] в виде «букв,
   цифры, дефис". При совпадении будет возвращена информация для
   совпадающие серверы имен.  Следующий URL будет использоваться для поиска
   информация об именах серверов имен, соответствующих
   Шаблон "ns[1-9]\.e[a-z]ample\.com":
   https://example.com/rdap/nameservers?name=ns%5B1-9%5D%5C.e%5Ba-
   z%5Dample%5C.com&searchtype=regex
   Интернационализированные имена серверов имен в формате U-метки [RFC5890] может
   также соответствовать расширенным шаблонам поиска регулярных выражений POSIX.
   Шаблоны поиска для этих имен имеют вид
   /nameservers?name=XXXX&searchtype=regex, где XXXX — это POSIX
   расширенное регулярное выражение. Небезопасные для URL символы в XXXX ДОЛЖНЫ быть
   процентное кодирование. Процентное кодирование ДОЛЖНО быть таким, как описано в разделе
   2.1 RFC 3986 [RFC3986]. Предоставленное регулярное выражение будет
   сопоставляется с именами серверов имен в формате U-метки. См. раздел 6.1.
Фрегли и др. Истекает 6 июня 2018 г. [Страница 5] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   RFC 7482 [RFC7482] для информации, описывающей символ U-метки. 
   кодирование. См. Раздел 5 для других соображений относительно обычного
   сопоставление выражений U-меток.
   Поиск информации о сервере имен по IP-адресу сервера имен
   указывается с помощью этой формы:
   серверы имен?ip=YYYY&searchtype=regex
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то YYYY ДОЛЖЕН быть расширенным регулярным выражением POSIX. Не-
   Безопасные для URL символы в YYYY ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 39.86 [RFC3986].
   Предоставленное регулярное выражение будет сопоставлено с IPv4.
   адреса [RFC1166] и IPv6-адреса [RFC5952], связанные с
   определенные серверы имен. Следующий URL будет использоваться для поиска
   имена серверов имен, которые разрешаются в адреса, соответствующие
   Шаблон "192\.0\.[1-9]\.0":
   https://example.com/rdap/
   серверы имен?ip=192%5C.0%5C.%5B1-9%5D%5C.0&searchtype=regex
2.3. Поиск объекта
   Синтаксис: entity?fn=<шаблон поиска имени объекта>&searchtype=regex
   Синтаксис: entity?handle=<поиск дескриптора сущности
   шаблон>&тип_поиска=регулярное выражение
   Поиск информации об объекте по имени задается с помощью этого
   форма:
   сущности?fn=XXXX&searchtype=regex
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то XXXX ДОЛЖЕН быть расширенным регулярным выражением POSIX.  Не-
   Безопасные для URL символы в XXXX ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 39.86 [RFC3986].
   Предоставленное регулярное выражение будет сопоставлено с «FN».
   собственность юридического лица (например, контактное лицо, владелец регистрации или регистратор)
   имя, как указано в Разделе 5.1 RFC 7483 [RFC7483].
   следующий URL-адрес будет использоваться для поиска информации об именах объектов
   соответствие шаблону "Bobby[[:space:]]Joe[a-z]*":
   https://example.com/rdap/
   сущности?fn=Бобби%5B%5B%3Aspace%3A%5D%5DJoe%5Ba-
   z%5D%2A&searchtype=regex
Фрегли и др. Истекает 6 июня 2018 г. [Страница 6] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   Поиск информации об объекте по дескриптору задается с помощью этого
   форма:
   объекты?handle=XXXX&searchtype=regex
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то XXXX ДОЛЖЕН быть расширенным регулярным выражением POSIX.  Не-
   Безопасные для URL символы в XXXX ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 3986 [RFC3986].
   Предоставленное регулярное выражение будет сопоставлено с сущностью
   (например, контактное лицо, регистрант или регистратор) идентификатор, синтаксис которого
   зависит от поставщика регистрации. Следующий URL будет
   используется для поиска информации для дескрипторов сущностей, соответствующих "CID-
   4[0-9]*" шаблон:
   https://example.com/rdap/entities?handle=CID-
   4% 5B0-9% 5D% 2A и тип поиска = регулярное выражение
2.4. Сегменты будущего пути
   НЕОБЯЗАТЕЛЬНЫЕ расширения для новых сегментов пути RDAP, определенных в будущем RDAP
   спецификации МОГУТ быть реализованы для поддержки POSIX расширенных регулярных
   возможность поиска выражений. Синтаксис для таких НЕОБЯЗАТЕЛЬНЫХ
   расширения ДОЛЖНЫ быть смоделированы на основе синтаксиса, определенного в Разделе 2.1,
   Раздел 2.2 и Раздел 2.3. Следующий шаблон синтаксиса ДОЛЖЕН быть
   последовало:
   Синтаксис: {path_segment}?{property}=XXXX&searchtype=regex
   Если параметр строки запроса URL "searchtype" имеет значение
   "regex", то XXXX ДОЛЖЕН быть расширенным регулярным выражением POSIX.  Не-
   Безопасные для URL символы в XXXX ДОЛЖНЫ быть закодированы в процентах. Процент-
   кодирование ДОЛЖНО соответствовать описанию в разделе 2.1 RFC 39.86 [RFC3986].
   Предоставленное регулярное выражение будет сопоставлено со свойством
   заданный {свойством} для сегмента пути, заданного
   {сегмент_пути}. Например, если новый сегмент пути RDAP "foo"
   определено и имеет свойство "bar", следующий URL-адрес будет использоваться для
   найти информацию для типа ресурса "foo" со свойством "bar"
   соответствующий шаблону "widget:.*mech.*":
   https://example.com/rdap/
   foo?bar=widget%3A.%2Amech.%2A&searchtype=regex
3. Синтаксис шаблона поиска
   Синтаксис расширенного шаблона поиска регулярных выражений POSIX определен в
   Раздел 9IEEE Std 1003.1, издание 2013 г.
   [IEEE.1003.1_2013_EDITION]. Реализация службы RDAP МОЖЕТ
Фрегли и др. Истекает 6 июня 2018 г. [Страница 7] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   реализовать подмножество расширенного синтаксиса регулярных выражений и
   возможности, определенные спецификацией.  Служба RDAP
   реализация ДОЛЖНА указывать синтаксис регулярного выражения и
   возможности, которые он поддерживает в ответ на запрос к пути /help
   сегмент, как указано в разделе 3.1.6 RFC 7482 [RFC7482].
   Символы в шаблоне поиска регулярного выражения могут быть URI
   зарезервированные символы. Чтобы избежать двусмысленности при анализе URL-адреса, содержащего
   шаблон поиска по регулярному выражению, небезопасный для URL символ в
   шаблон поиска регулярного выражения ДОЛЖЕН быть закодирован в процентах как
   описан в RFC 3986 [RFC3986].
4. Обработка запросов
   Клиенты RDAP, использующие шаблоны поиска регулярных выражений, ДОЛЖНЫ процент-
   кодировать небезопасные для URL символы в поиске по регулярному выражению
   как описано в RFC 3986 [RFC3986]. Регулярное выражение
   СЛЕДУЕТ соответствовать синтаксису регулярных выражений и
   возможности, поддерживаемые реализацией службы RDAP, которая
   запрашивается для получения предсказуемых результатов. Использование
   регулярное выражение, которое не соответствует возможностям
   реализация службы RDAP ДОЛЖНА приводить к возврату HTTP-запроса. 
   Код ответа 400, как описано в разделе 5.4 RFC 7480 [RFC7480].
   Реализация службы RDAP будет получать регулярные выражения
   шаблоны поиска, содержащие символы с процентным кодированием. До
   обрабатывая регулярное выражение, служба RDAP ДОЛЖНА декодировать
   получил символы с процентным кодированием в регулярных выражениях как
   описан в RFC 3986 [RFC3986]. После расшифровки полученного регулярного
   выражение, регулярное выражение ДОЛЖНО соответствовать, как описано в
   Раздел 2.1, Раздел 2.2 и Раздел 2.3. Совпадающие записи, связанные
   для поиска затем возвращаются в клиенте.
   Серверные операционные системы обычно настроены на использование коллекции
   региональных и языковых правил, описывающих обработку по умолчанию
   соглашения, такие как порядок сортировки, формат даты и т. д., как часть
   настройка "локали". Библиотека регулярных выражений, используемая для RDAP
   реализация службы обычно получает всю информацию, которую она
   требуется для текущей локали из базовой операционной системы. 
   Локаль, используемая библиотекой регулярных выражений, может повлиять на
   результаты поиска по регулярному выражению на основе локали
   обработки. Например, локаль POSIX может иметь последовательности сопоставления
   для описания того, как определенные символы или группы символов могут быть
   упорядоченный. В чешском языке, например, "ch" можно трактовать как
   если бы это был один персонаж. Вы можете использовать элемент последовательности сопоставления
   [.ch.] внутри выражения в квадратных скобках, чтобы соответствовать "ch", когда чешский
   локаль (cs-CZ) активна, но аналогичная последовательность сопоставления не будет
   соответствовать строке, если языковой стандарт системы был, например, en_US. Пользователи
Фрегли и др. Истекает 6 июня 2018 г. [Страница 8] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   отправка поисковых запросов с регулярными выражениями, которые не учитывают
   обработка, зависящая от локали, может вводить в заблуждение или быть неточной
   полученные результаты.  В связи с этим РЕКОМЕНДУЕТСЯ идентифицировать основную
   языковой стандарт в сегменте пути «справка», как указано в разделе 3.1.6
   RFC 7482 [RFC7482]. Это поможет клиентам RDAP создавать регулярные
   выражения, которые можно обрабатывать предсказуемым образом.
   Спецификация регулярных выражений POSIX [IEEE.1003.1_2013_EDITION]
   позволяет реализациям обеспечивать поиск без учета регистра. RDAP
   реализации службы ДОЛЖНЫ реализовывать поиск без учета регистра
   как описано в спецификации. Это позволит обеспечить согласованность
   в результатах поиска независимо от того, являются ли данные RDAP
   искал. Например, некоторые реализации службы RDAP могут
   представлять доменные имена в верхнем регистре во время поиска, в то время как другие
   Реализации службы RDAP могут представлять доменные имена строчными буквами.
   или смешанный регистр во время поиска. Поиск без учета регистра будет
   уменьшить необходимость для клиентов поиска знать, как каждая служба RDAP
   реализация представляет случай доступных для поиска данных.  служба RDAP
   реализации, которые не выполняют поиск без учета регистра, могут
   выдавать неожиданные результаты поиска для сущностей, которые не знают о
   как служба представляет случай доступных для поиска данных.
   Реализация службы RDAP ДОЛЖНА указывать ее поддержку или отсутствие
   поддержка поиска без учета регистра в ответ на запрос к
   /help сегмент пути, как указано в разделе 3.1.6 RFC 7482.
   [RFC7482].
   Серверы указывают на успех или неудачу обработки запроса
   шаблон поиска регулярного выражения, возвращая соответствующий HTTP
   код ответа клиенту. Коды ответов не конкретно
   указанные в этом документе, описаны в RFC 7480 [RFC7480].
5. Вопросы интернационализации
   Реализация службы RDAP, поддерживающая регулярные выражения
   шаблоны поиска ДОЛЖНЫ поддерживать построение шаблона и шаблон
   сопоставление с использованием строк символов в кодировке UTF-8. Другой персонаж
   вопросы кодирования описаны в разделе 6.1 RFC 7482.
   [RFC7482].
6. Вопросы реализации
   Набор связанных записей, которые могут быть возвращены в ответ на
   поиск с шаблоном поиска по регулярному выражению подчиняется
   ограничения, указанные в разделе 4. 2 RFC 7482 [RFC7482].
   Реализация службы RDAP МОЖЕТ выбрать ограничение объема
   выполняет поиск данных RDAP, которыми управляет служба RDAP.
Фрегли и др. Истекает 6 июня 2018 г. [Страница 9] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   реализация. Например, ответ RDAP на запрос, который может
   сопоставляться с несколькими TLD или данными в связанных репозиториях RDAP
   (например, распределенные между реестром домена и доменным
   регистратору) нужно возвращать совпадения только для данных, управляемых RDAP.
   реализация услуги.
   Серверные операционные системы обычно настроены на использование коллекции
   региональных и языковых правил, описывающих обработку по умолчанию
   соглашения, такие как порядок сортировки, формат даты и т. д., как часть
   настройка «локаль». Библиотека регулярных выражений, используемая для RDAP
   реализация службы обычно получает всю информацию, которую она
   требуется для текущей локали из базовой операционной системы. 
   Локаль, используемая библиотекой регулярных выражений, может повлиять на
   результаты поиска по регулярному выражению на основе локали
   обработка. Например, локаль POSIX может иметь последовательности сортировки.
   для описания того, как определенные символы или группы символов могут быть
   упорядоченный. В чешском языке, например, «ch» можно трактовать как
   если бы это был один персонаж. Вы можете использовать элемент последовательности сопоставления
   [.ch.] внутри выражения в квадратных скобках, чтобы соответствовать 'ch', когда чешский
   локаль (cs-CZ) активна, но аналогичная последовательность сопоставления не будет
   соответствовать строке, если языковой стандарт системы был, например, en_US. Пользователи
   отправка поисковых запросов с регулярными выражениями, которые не учитывают
   обработка, зависящая от локали, может вводить в заблуждение или быть неточной
   полученные результаты. В связи с этим РЕКОМЕНДУЕТСЯ идентифицировать основную
   языковой стандарт в сегменте пути «помощь», как определено в разделе 3. 1.6 RFC.
   7482 [RFC7482]. Это поможет клиентам RDAP создавать регулярные
   выражения, которые можно обрабатывать предсказуемым образом.
   Разработчики должны позаботиться о том, чтобы декодирование процентных
   закодированные символы в полученном регулярном выражении выполняются только
   однажды. Стандартные API для обработки HTTP-запросов, скорее всего, будут работать
   декодирование символов с процентным кодированием перед предоставлением полученного
   регулярное выражение в код реализации службы RDAP. В таком
   В этом случае код реализации службы RDAP не должен пытаться
   выполнять декодирование символов с процентным кодированием.
   Результаты сопоставления регулярных выражений для некоторых шаблонов поиска могут отличаться
   на основе используемой поисковой системы регулярных выражений, версия
   используемая система и конфигурация поисковой системы. За
   например, POSIX [IEEE.1003.1_2013_EDITION] определяет другую семантику
   в зависимости от того, используются ли в поиске базовые регулярные выражения (BRE) или
   Расширенные регулярные выражения (ERE).  Поисковые механизмы, выполняющие
   обработка поиска, совместимая с Perl-совместимыми регулярными выражениями
   (PCRE), как определено pcre.org [PCRE] и в Perl 5 [PERLRE], также может
   производить совпадения, которые отличаются от совпадений, созданных совместимыми с POSIX
   сопоставление регулярных выражений. Различия в регулярных выражениях
   соответствие между POSIX BRE, POSIX ERE и PCRE показано на
   примеры ниже, где команда «sed» без опции «-E»
Фрегли и др. Истекает 6 июня 2018 г. [Страница 10] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   используется для соответствия POSIX BRE, команда "sed" с параметром "-E"
   используется для соответствия POSIX ERE, а команда "perl" используется для
   Соответствие ПКРЕ.
            $ эхо 'abcdef' | sed 's/ab(cd)?(cdef)?/[xxxx]/'
            abcdef
            $ эхо 'abcdef' | sed -E 's/ab(cd)?(cdef)?/[xxxx]/'
            [хххх]
            $ эхо 'abcdef' | perl -p -e 's/ab(cd)?(cdef)?/[xxxx]/'
            [хххх]эф
            $ эхо 'ааа' | sed 's/a\{3,\}/[xxxx]/'
            [хххх]
            $ эхо 'ааа' | sed 's/a{3,}/[xxxx]/'
            ааа
            $ эхо 'ааа' | sed -E 's/a\{3,\}/[xxxx]/'
            ааа
            $ эхо 'ааа' | sed -E 's/a{3,}/[xxxx]/'
            [хххх]
            $ эхо 'ааа' | perl -p -e 's/a\{3,\}/[xxxx]/'
            ааа
            $ эхо 'ааа' | perl -p -e 's/a{3,}/[xxxx]/'
            [хххх]
   Использование расширенных регулярных выражений POSIX мотивировано широким
   поддержка в виде доступности API [GNU] и поддержки баз данных,
   со следующими основными базами данных, поддерживающими расширенный регулярный стандарт POSIX
   выражения:
           Оракул [ОРАКУЛ]
           MySQL [MYSQL]
           Постгрес [POSTGRES]
7.  Соображения IANA
   ДЛЯ ОБСУЖДЕНИЯ: Параметр запроса URL "searchtype" со значением
   «регулярное выражение» указано здесь как синтаксис для указания того, что RDAP
   Шаблон поиска запроса представляет собой расширенное регулярное выражение POSIX.
   тот же подход можно использовать для определения будущих ДОПОЛНИТЕЛЬНЫХ RDAP.
   поисковые механизмы. Реестр поиска RDAP, поддерживаемый IANA.
   механизмы рекомендуется для записи списка допустимых значений
   для параметра запроса searchtype.
Фрегли и др. Истекает 6 июня 2018 г. [Страница 11] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
8. Статус реализации
   Примечание для редактора RFC: пожалуйста, удалите весь этот раздел, прежде чем
   публикация вместе со ссылкой на RFC7942 [RFC7942].
   В этом разделе записывается состояние известных реализаций
   протокол, определенный этой спецификацией на момент публикации этого
   Internet-Draft и основан на предложении, описанном в RFC 7942. 
   Описание реализаций в этом разделе предназначено для
   помогать IETF в процессах принятия решений по продвижению проектов к
   RFC. Обратите внимание, что перечисление любой отдельной реализации
   здесь не означает одобрения со стороны IETF. Кроме того, никаких усилий
   было потрачено на проверку представленной здесь информации, которая была
   предоставлено участниками IETF. Это не предназначено и не должно
   истолковываться как каталог доступных реализаций или их
   Особенности. Читателям рекомендуется принять к сведению, что другие реализации могут
   существует.
   Согласно RFC 7942, "это позволит рецензентам и рабочим группам
   уделять должное внимание документам, имеющим значение для
   работающий код, который может служить свидетельством ценных экспериментов
   и отзывы, которые сделали реализованные протоколы более зрелыми.
   Отдельные рабочие группы могут использовать эту информацию как
   они считают нужным».
8.1. Лаборатории Верисин
      Ответственная организация: Verisign Labs
      Местонахождение: https://rdap. verisignlabs.com/
      Описание: Эта реализация включает поддержку POSIX.
      запросы RDAP расширенного реестра доменов регулярных выражений с использованием
      оперативные данные из национальных доменов верхнего уровня .cc и .tv.
      Эта реализация также поддерживает федеративную аутентификацию с использованием
      Провайдеры OpenID Connect, как описано в [RDAPOPENID]. Три
      уровни доступа предоставляются на основе аутентифицированной личности
      клиент:
      1. Без аутентификации: в ответ возвращается ограниченная информация.
          на запросы от неаутентифицированных клиентов.
      2. Базовый: клиенты, которые аутентифицируются с помощью общедоступного
          поставщик удостоверений, такой как Google Gmail или Microsoft Hotmail,
          получить всю информацию, доступную неавторизованному
          клиент плюс дополнительные регистрационные метаданные, но не
          личную информацию, связанную с юридическими лицами.
      3. Расширенный: клиенты, которые аутентифицируются с использованием более строгого
          поставщик удостоверений получит всю информацию
          доступный базовому клиенту, а также любую информацию,
          оператор сервера считает целесообразным полностью авторизованный
Фрегли и др.  Истекает 6 июня 2018 г. [Страница 12] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
          клиент. В настоящее время поддерживаемые поставщики удостоверений включают
          разработан Verisign Labs
          (https://testprovider.rdap.verisignlabs.com/) и CZ.NIC
          (https://www.mojeid.cz/).
      Уровень зрелости: это исследование «доказательство концепции».
      реализация.
      Покрытие: эта реализация включает в себя все функции
      описаны в этой спецификации.
      Контактная информация: Свапнил Шет, [email protected]
8.2. Служба RDAP APNIC
      Ответственная организация: Азиатско-Тихоокеанский сетевой информационный центр
      (АПНИК)
      Местонахождение: https://testrdap.apnic.net/
      Описание: Эта реализация включает поддержку POSIX.
      расширенные запросы RDAP с регулярными выражениями для домена и объекта
      классы объектов. Источник данных — это подмножество моментального снимка
      данные производственного реестра. 
      Уровень зрелости: это исследование «доказательство концепции».
      реализация.
      Покрытие: Помимо выражений классов символов, сопоставление
      символы и выражения класса эквивалентности, все функции
      описанные в этой спецификации.
      Контактная информация: Том Харрисон, [email protected]
9. Вопросы безопасности
   Охранными услугами для операций, указанных в настоящем документе, являются
   описано в RFC 7481 [RFC7481].
   Функции поиска обычно требуют больше ресурсов сервера (например,
   как память, циклы ЦП и пропускная способность сети) по сравнению с базовым
   функциональность поиска. Это увеличивает риск потери ресурсов сервера.
   истощение и последующий отказ в обслуживании из-за злоупотреблений. Этот риск
   можно смягчить, разработав и внедрив средства контроля для ограничения
   возможность поиска идентифицированных и авторизованных клиентов. Если те
   клиенты ведут себя плохо, их поисковые права могут быть приостановлены или
   отозван. Ограничение скорости, как описано в разделе 5. 5 RFC 7480.
   [RFC7480] также можно использовать для управления скоростью получения результатов поиска.
   Запросы. Операторы серверов также могут снизить риск, ограничив
   количество информации, возвращаемой в ответ на поисковый запрос.
   Функциональность поиска также увеличивает риск раскрытия конфиденциальной информации.
   объектные отношения, которые в противном случае могли бы быть неочевидными. За
   Например, поиск, возвращающий варианты IDN [RFC6927], которые не
   явное совпадение с шаблоном поиска, предоставленным клиентом, может раскрыть
   информация о зарегистрированных доменных именах, которые не могли бы быть иначе
Фрегли и др. Истекает 6 июня 2018 г. [Страница 13] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   доступный. Разработчики должны учитывать политику и конфиденциальность
   последствия возврата информации, которая не была явно
   просил.
   Обратите внимание, что не может быть единого возврата статической информации. 
   политика, применимая ко всем клиентам в равной степени. Личность клиента и
   соответствующие разрешения могут быть важным фактором в определении того, как
   широкий набор ответов будет для любого конкретного запроса.
10. Благодарности
   Автор хотел бы поблагодарить следующих лиц за
   их вклад в разработку этого документа: TBD.
11. Ссылки
11.1. Нормативные ссылки
   [IEEE.1003.1_2013_ИЗДАНИЕ]
              IEEE, «Стандарт для информационных технологий, портативных
              Базовые спецификации интерфейса операционной системы (POSIX(R))
              Выпуск 7", IEEE 1003.1, издание 2013 г.,
              ДОИ 10.1109/ieestd.2013.6506091, апрель 2013 г.,
              .
   [RFC2119] Брэднер, С., «Ключевые слова для использования в RFC для указания
              Уровни требований», BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, март 1997 г.,
              .
   [RFC3986] Бернерс-Ли, Т. , Филдинг, Р., и Л. Масинтер, "Униформа
              Идентификатор ресурса (URI): общий синтаксис», STD 66,
              RFC 3986, DOI 10.17487/RFC3986, январь 2005 г.,
              .
   [RFC5890] Кленсин, Дж., "Интернационализированные доменные имена для
              Приложения (IDNA): определения и структура документа»,
              RFC 5890, DOI 10.17487/RFC5890, август 2010 г.,
              .
   [RFC5952] Кавамура, С. и М. Кавасима, «Рекомендация по IPv6
              Текстовое представление адреса», RFC 5952,
              ДОИ 10.17487/RFC5952, август 2010 г.,
              .
Фрегли и др. Истекает 6 июня 2018 г. [Страница 14] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   [RFC7230] Филдинг, Р., изд. и Дж. Решке, изд., "Передача гипертекста
              Протокол (HTTP/1.1): синтаксис и маршрутизация сообщений»,
              RFC 7230, DOI 10. 17487/RFC7230, июнь 2014 г.,
              .
   [RFC7480] Ньютон А., Эллакотт Б. и Н. Конг, «Использование HTTP в
              Протокол доступа к регистрационным данным (RDAP)», RFC 7480,
              DOI 10.17487/RFC7480, март 2015 г.,
              .
   [RFC7481] Холленбек, С. и Н. Конг, «Службы безопасности для
              Протокол доступа к регистрационным данным (RDAP)», RFC 7481,
              DOI 10.17487/RFC7481, март 2015 г.,
              .
   [RFC7482] Ньютон, А. и С. Холленбек, "Доступ к регистрационным данным
              Формат запроса протокола (RDAP), RFC 7482,
              DOI 10.17487/RFC7482, март 2015 г.,
              .
   [RFC7483] Ньютон, А. и С. Холленбек, «Ответы JSON для
              Протокол доступа к регистрационным данным (RDAP)", RFC 7483,
              DOI 10.17487/RFC7483, март 2015 г.,
               rfc-editor.org/info/rfc7483>.
   [RFC7942] Шеффер, Ю. и А. Фаррел, «Повышение осведомленности о беге».
              Код: Раздел статуса реализации", BCP 205,
              RFC 7942, DOI 10.17487/RFC7942, июль 2016 г.,
              .
11.2. Информативные ссылки
   [GNU] gnu.org, "Сопоставление регулярных выражений GNU",
              .
   [MYSQL] mysql.com, "Регулярные выражения MySQL",
              .
   [ORACLE] Oracle Corporation, "Oracle SQL и POSIX Regular
              Стандарт экспрессии",
              .
   [PCRE] pcre.org, "Perl-совместимые регулярные выражения",
              .
Фрегли и др. Истекает 6 июня 2018 г. [Страница 15] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г. 
   [PERLRE] perl.org, «Регулярные выражения Perl»,
              .
   [ПОСТГРЕС]
              postgresql.org, "Регулярные выражения PostgreSQL POSIX",
              .
   [РДАПОПЕНИД]
              ietf.org, «Федеративная аутентификация для регистрационных
              Протокол доступа к данным (RDAP) с использованием OpenID Connect",
              .
   [RFC1166] Киркпатрик С., Шталь М. и М. Рекер, "Интернет
              числа», RFC 1166, DOI 10.17487/RFC1166, 19 июля.90,
              .
   [RFC6927] Левин, Дж. и П. Хоффман, «Варианты имен второго уровня.
              Зарегистрировано в доменах верхнего уровня», RFC 6927,
              DOI 10.17487/RFC6927, май 2013 г.,
              .
Приложение A.  Журнал изменений
   00: Начальная версия.
   01: Обновлены и перемещены недействительные нормативные ссылки в информативные
      использованная литература
   02: Указано использование процентного кодирования для зарезервированного URL-адреса.
      символов в регулярных выражениях и удаленной спецификации для
      кодировка base64url для регулярных выражений
   03: Добавлена ​​информация о влиянии локали системы на
      обработка поиска по регулярному выражению. Также обновил
      раздел состояния реализации с информацией APNIC.
Адреса авторов
   Эндрю Фрегли
   Лаборатории Верисин
   12061 Блюмонт Уэй
   Рестон, Вирджиния, 2019 г.0
   США
   Электронная почта: [email protected]
   URI: http://www.verisignlabs.com/
Фрегли и др. Истекает 6 июня 2018 г. [Страница 16] 

Internet-Draft RDAP Search с использованием регулярных выражений, декабрь 2017 г.
   Свапнил Шет
   Лаборатории Верисин
   12061 Блюмонт Уэй
   Рестон, Вирджиния, 20190
   США
   Электронная почта: ssheth@verisign. com
   URI: http://www.verisignlabs.com/
   Скотт Холленбек
   Лаборатории Верисин
   12061 Блюмонт Уэй
   Рестон, Вирджиния, 20190
   США
   Электронная почта: [email protected]
   URI: http://www.verisignlabs.com/
Фрегли и др. Истекает 6 июня 2018 г. [Страница 17]
 

regex(7): регулярное выражение POSIX.2 — справочная страница Linux

Имя

regex — регулярные выражения POSIX.2

Описание

Регулярные выражения («RE»), как определено в POSIX.2, бывают двух видов: современные RE (примерно egrep ; POSIX.2 называет эти RE «расширенными» и устаревшими RE (примерно те из ed (1) ; POSIX.2 «базовые» RE). Устаревшие RE в основном существуют для обратной совместимости в некоторых старых программах; они будут обсуждаться в конце. POSIX.2 оставляет открытыми некоторые аспекты синтаксиса и семантики RE; «» Метки решения по этим аспектам, которые могут быть не полностью переносимы на другие реализации POSIX. 2.

RE (современный) RE представляет собой одну или несколько непустых ветвей , разделенных aq|aq. Он соответствует всему, что соответствует одной из ветвей.

Ветвь состоит из одной или более частей , связанных. Он соответствует совпадению для первого, затем совпадению для второго и т. д.

Часть представляет собой атома , за которым может следовать один aq*aq, aq+aq, aq?aq или , связанный . Атом, за которым следует aq*aq, соответствует последовательности из 0 или более совпадения атома. Атом, за которым следует aq+aq, соответствует последовательности из 1 или более совпадений атома. Атом, за которым следует aq?aq, соответствует последовательности 0 или 1 совпадения атома.

связанный представляет собой aq{aq, за которым следует десятичное целое число без знака, за которым, возможно, следует aq,aq, возможно, за которым следует другое десятичное целое число без знака, всегда затем водн. вод. Целые числа должны лежать в диапазоне от 0 до RE_DUP_MAX (255) включительно, а если их два, то первое не может превышать второе. aq (соответствует нулевой строке в начале строки), aq$aq (соответствует нулевой строке в конце строки), aq\aq, за которым следует один из символов » 9.[$()|*+?{\ » (соответствует тому символу, который считается обычным символ), aq\aq, за которым следует любой другой символ (соответствующий этому символу, рассматриваемому как обычный символ, как если бы aq\aq не присутствовал), или одиночный символ без другого значения (соответствует этому символу). aq{aq, за которым следует символ, отличный от цифры, является обычным символом, а не началом связанного. Недопустимо заканчивать RE на aq\aq.

Выражение в квадратных скобках представляет собой список символов, заключенных в » 9aq, он соответствует любому отдельному символу (но см. ниже) , а не из остального списка. Если два символа в списке разделены aq-aq, это сокращение для полного диапазона символов между этими двумя (включительно) в последовательности сопоставления, например, « [0-9] » в ASCII соответствует любой десятичной цифре. Два диапазона не могут иметь общую конечную точку, например, « a-c-e «. Диапазоны очень зависят от последовательности сопоставления, и портативные программы не должны полагаться на них. 9водный). Чтобы включить буквальный aq-aq, сделайте его первым или последним символ или вторая конечная точка диапазона. Чтобы использовать литерал aq-aq в качестве первой конечной точки диапазона, заключите его в « [.» и «.] «, чтобы сделать его элемент сопоставления (см. ниже). За исключением этих и некоторых комбинаций с использованием aq[aq (см. следующие абзацы), все другие специальные символы, включая aq\aq, теряют свое особое значение в скобочном выражении.

В выражении в квадратных скобках элемент сортировки (символ, многосимвольная последовательность, которая сортируется, как если бы это был одиночный символ, или имя последовательности сопоставления для любого из них), заключенное в » [. » и » .] » означает последовательность символов этого элемента сортировки. Последовательность представляет собой один элемент списка выражений в квадратных скобках. Таким образом, выражение в квадратных скобках, содержащее многосимвольный элемент сопоставления, может соответствовать более чем одному символу, например: Например, если последовательность сопоставления включает элемент сопоставления «ch», то RE « [[.ch.]]*c » соответствует первым пяти символам «chchcc».

В выражении в квадратных скобках элемент сопоставления, заключенный в » 9′] » являются синонимами. Класс эквивалентности не может быть конечной точкой диапазона.

В выражении в квадратных скобках имя класса символов , заключенное в « [: » и «:] », означает список всех символов, принадлежащих этот класс. Стандартные имена классов персонажей:

 пунктирная цифра
пространство альфа-графика
пустой нижний верхний
cntrl print xdigit 

Они обозначают классы символов, определенные в wctype (3) . Локаль может предоставить другие. Класс символов нельзя использовать в качестве конечной точки диапазон.

В случае, если RE может соответствовать более чем одной подстроке данной строки, RE соответствует той, которая начинается в строке самой ранней. Если RE может соответствовать более одной подстроки, начинающейся в этой точке, она соответствует самой длинной. Подвыражения также соответствуют максимально длинным подстрокам с учетом ограничения чтобы все совпадение было как можно более длинным, при этом подвыражения, начинающиеся раньше в RE, имеют приоритет над теми, которые начинаются позже. Обратите внимание, что более высокий уровень таким образом, подвыражения имеют приоритет над подвыражениями компонентов более низкого уровня.

Длина соответствия измеряется в символах, а не в элементах сортировки. Нулевая строка считается более длинной, чем отсутствие совпадений. Например, « bb* » соответствует три средних символа «abbbc», « (wee|week)(knights|nights) » соответствуют всем десяти символам «weeknights», когда « (. *).* » соответствует «abc» подвыражение в скобках соответствует всем трем символам, а когда « (a*)* » соответствует «bc», как все RE, так и заключенное в скобки подвыражение соответствует нулевой строке.

Если задано соответствие, не зависящее от регистра, эффект будет таким же, как если бы все различия регистра исчезли из алфавита. Когда алфавит, который существует в множественные регистры отображаются как обычный символ вне скобочного выражения, он эффективно преобразуется в скобочное выражение, содержащее оба регистра, например, aqxaq становится « [xX] «. Когда он появляется внутри выражения в квадратных скобках, все его аналоги case добавляются к выражению в квадратных скобках, поэтому например, «9хХ] «.

Никаких особых ограничений на длину RE не накладывается. Программы, предназначенные для переноса, не должны использовать RE длиннее 256 байт, так как реализация может отказаться принимать такие RE и оставаться совместимыми с POSIX.

Устаревшие («базовые») регулярные выражения отличаются в нескольких отношениях. aq|aq, aq+aq и aq?aq — обычные символы, и для них не существует эквивалента. функциональность. Разделителями для границ являются « \{ » и « \} «, причем aq{aq и aq}aq сами по себе являются обычными символами. Скобки для вложенных подвыражения «9водный).

Наконец, есть один новый тип атома, обратная ссылка : aq\aq, за которой следует ненулевая десятичная цифра d соответствует той же последовательности символов соответствует d -му подвыражению в скобках (нумерация подвыражений по положению их открывающих скобок слева направо), так что для например, « \([bc]\)\1 » соответствует «bb» или «cc», но не «bc».

Ошибки

Иметь два вида RE — это провал.

Текущая спецификация POSIX.2 говорит, что aq)aq является обычным символом в отсутствие несоответствующего aq(aq; это был непреднамеренный результат ошибки формулировки, и возможны изменения. Избегайте полагаться на него.

Обратные ссылки — ужасный провал, создающий серьезные проблемы для эффективных реализаций. Они также несколько расплывчато определены (соответствует ли « a\(\(b\)*\2\)*d » соответствует «abbbd»?). Избегайте их использования.

Спецификация POSIX.2 для независимого от регистра соответствия расплывчата. Приведенное выше определение «один случай подразумевает все случаи» является текущим консенсусом среди исполнителей относительно правильной интерпретации.

Автор

Эта страница была взята из пакета регулярных выражений Генри Спенсера.

См. также

grep (1) , регулярное выражение (3)

POSIX.2, раздел 2.8 (Обозначение регулярных выражений).

по ссылке

блейзер (8), шкаф (6), collectd.conf (5), cvsgraph.conf (5), даркс (1), DHCP-Eval (5), dselect (1), опыт (1), найти (1), Fluxbox-ключи (5), генту (1), giftcurs.