Освобожденные регулярные выражения
Регулярные выражения являются мощным механизмом для обработки текста. Можно использовать регулярные выражения, чтобы искать образец в блоке текста, заменить биты того текста с другими битами текста и управлять строками различными другими тонкими и интересными способами.
Сама оболочка не поддерживает регулярные выражения исходно. Для использования регулярных выражений необходимо вызвать внешний инструмент.
Некоторые инструменты, поддерживающие регулярные выражения, включают:
awk
— Язык сценариев в и себя. Описанный далее, в Как Неловкий.grep
— Возвращает список строк, соответствующих выражение (или строки, не соответствующие с-v
флаг). Выходы с состоянием истины (0), если соответствие произошло или ложь (1), если не произошло никакое соответствие.perl
— Язык сценариев с более усовершенствованной функциональностью регулярного выражения.sed
— Инструмент, выполняющий текстовые замены на основе регулярных выражений.
Вы будете видеть эти команды, используемые всюду по этой главе.
В целях этой главы необходимо вставить следующие строки текста в текстовый файл с окончаниями строки UNIX (новая строка):
Mary had a little lamb, |
its fleece was white as snow, |
and everywhere that Mary went, |
the lamb was sure to go. |
A few more lines to confuse things: |
Marylamb had a little. |
This is a test. This is only a test. |
Mary was married. A lamb was nearby. |
Mary, a little lamb, and my grocer's freezer... |
Mary a lamb. |
Marry a lamb. |
Mary had a lamb looked like a lamb. |
I want chocolate for Valentine's day. |
This line contains a slash (/). |
This line contains a backslash (\). |
This line contains brackets ([]). |
Why is mary lowercase? |
What about Mary, Mary, and Mary? |
const people fox |
constant turtles bear |
constellation Libra |
How about 9 * 9? |
The quick brown fox jumped over the lazy dog. |
Сохраните это в вызванный файл poem.txt
.
Где я могу использовать регулярные выражения?
Регулярные выражения обычно используются для текстовой фильтрации. Например, для изменения каждого возникновения буквы "a"
в строке к капиталу "A"
, Вы могли бы повторить строку и передать результат по каналу к sed
как это:
echo "This is a test, this is only a test" | sed 's/a/A/g' |
Можно также использовать регулярные выражения для поиска строк в файле или блоке текста при помощи grep
команда. Например, для поиска слова "bar"
в файле foo.txt
, Вы могли бы сделать это:
grep "bar" foo.txt |
# or |
cat foo.txt | grep "bar" |
Наконец, при случае, может быть полезно использовать регулярные выражения в, проверяют утверждения. Это усовершенствованное использование описано далее в Использовании Регулярных выражений в, Проверяют Утверждения.
Типы регулярных выражений
Существует три основных типа регулярных выражений: основные регулярные выражения, расширенные регулярные выражения и регулярные выражения Perl. Всюду по этой главе разделы указывают на области, в которых они отличаются. Этот раздел является просто сводкой различий. Для большего количества подробности посмотрите надлежащий раздел.
Основные регулярные выражения и расширенные регулярные выражения отличаются по следующим областям:
Основные регулярные выражения используют наклонную черту влево до группирующихся/получающих круглых скобок (и до операторов канала в этих круглых скобках). Расширенные регулярные выражения не делают. Эти операторы описаны в Группирующихся Операторах.
Основные регулярные выражения используют наклонную черту влево до знака «плюс», когда используется означать “один или больше предыдущего символа или группы”. Расширенные регулярные выражения не делают. Этот оператор описан в Операторах Повторения и Подстановочных знаках.
Основные регулярные выражения используют наклонную черту влево до вопросительного знака, когда используется означать “нуль или один из предыдущего символа или группы”. Расширенные регулярные выражения не делают. Этот оператор описан в Операторах Повторения и Подстановочных знаках.
Регулярные выражения Perl эквивалентны расширенным регулярным выражениям с несколькими дополнительными функциями:
Perl может (дополнительно) использовать знак доллара вместо наклонной черты влево для представления переменных в образцах замены, как описано в Получении Операторов и Переменных.
Поддержки Perl, неполучая круглые скобки, как описано в Неполучении Круглых скобок.
Когда подстроки играют роль, как описано в Группирующихся Операторах, порядок многократных опций в круглых скобках может быть важным.
Perl позволяет Вам включать литеральную квадратную скобку где угодно в классе символов путем предшествования ему с наклонной чертой влево, как описано в Заключении в кавычки Специальных символов.
Perl добавляет много дополнительных переключателей, которые эквивалентны определенным специальным символам и классам символов. Они описаны в Ярлыках Класса символов.
Perl поддерживает более широкий диапазон модификаторов. Они описаны в Использовании Модификаторов.
Синтаксис регулярного выражения
Фундаментальный формат для регулярных выражений является одним из следующего, в зависимости от того, что Вы пытаетесь сделать:
/search_pattern/modifiers |
command/search_pattern/modifiers |
command/search_pattern/replacement/modifiers |
Первый синтаксис является основным поисковым синтаксисом. В отсутствие префикса команды такое регулярное выражение возвращает строки, соответствующие поисковый образец. В некоторых случаях метки наклонной черты могут быть (или должен быть), опущенный — в аргументе шаблона к grep
команда, например.
Второй синтаксис используется для большинства команд. В этой форме некоторая работа происходит на строках, соответствующих образец. Это может быть формой соответствия, или оно может включить удаление частей строки, соответствующих образец.
Третий синтаксис используется для команд замены. Они могут считаться более сложной формой поиска и замены.
Например, следующая команда ищет слово 'тест' в указанном файле:
# Expression: /test/ |
grep 'test' poem.txt |
Доступность команд и флагов варьируется несколько между вариантами регулярного выражения и описана в соответствующих разделах.
Позиционные привязки и флаги
Распространенный способ значительно изменить регулярное выражение, соответствующее, с помощью позиционных привязок и флагов.
Позиционные привязки позволяют Вам указывать позицию в строке текста, где выражению позволяют соответствовать. Существует две позиционных привязки, регулярно использующиеся: каре (^) и доллар ($). Когда помещено вначале или конец выражения, они соответствуют начало и конец строки текста, соответственно.
Например:
# Expression: /^Mary/ |
grep "^Mary" < poem.txt |
Это соответствует слово «Mary», но только когда это появляется в начале строки. Точно так же следующие соответствия слово «лиса», но только в конце строки:
# Expression: /fox$/ |
grep "fox$" < poem.txt |
Другой общий метод для изменения поведения при сравнении регулярного выражения с помощью флагов. Эти флаги, когда помещено в конце регулярного выражения, могут измениться, позволяют ли регулярному выражению соответствовать через многократные строки, является ли соответствие чувствительными к регистру или нечувствительными, и различными другими аспектами соответствия.
Обычно используемый флаг является глобальным флагом. По умолчанию только первое возникновение критерия поиска является соответствующим. Это имеет в основном беспокойство при выполнении замен. Глобальный флаг изменяет это так, чтобы замена изменила каждое соответствие в строке вместо просто первой.
Например:
# Expression: s/Mary/Joe/ |
sed "s/Mary/Joe/" < poem.txt |
Это заменяет только первое возникновение «Мэри» с «Джо». Путем добавления глобального флага к выражению это вместо этого заменяет каждое возникновение, как показано в следующем примере:
# Expression s/Mary/Joe/g |
sed "s/Mary/Joe/g" < poem.txt |
Подстановочные знаки и операторы повторения
Один из наиболее распространенных способов улучшить поиск регулярных выражений с использованием подстановочного соответствия.
Подстановочный знак является символом, занимающим место любого другого символа. В регулярных выражениях, период (.
) считается подстановочным знаком, поскольку он соответствует любой отдельный символ. Например:
# Expression: /wa./ |
grep 'wa.' poem.txt |
Это соответствует строки, содержащие, и «было» и «хочет», потому что точка может соответствовать любой символ.
Подстановочные знаки обычно объединяются с операторами повторения для соответствия строк, в которых известна только часть содержания. Например, Вы могли бы хотеть искать каждую строку, содержащую «Мэри» со словом «ягненок», кажущийся позже. Вы могли бы указать выражение как это:
# Expression: /Mary.*lamb/ |
grep "Mary.*lamb" poem.txt |
Это ищет Мэри, сопровождаемую нулем или большим количеством символов, сопровождаемых ягненком.
Конечно, Вы, вероятно, хотите, чтобы по крайней мере один символ между теми избежал соответствий для строк, содержащих «Marylamb». Наиболее распространенный способ решить это с плюс (+
) оператор. Однако можно создать это выражение несколькими способами:
# Expression (Basic): /Mary.\+lamb/ |
# Expression (Extended): /Mary.+lamb/ |
# Expression: /Mary..*lamb/ |
grep "Mary.\+lamb" poem.txt |
grep -E "Mary.+lamb" poem.txt # extended regexp |
grep "Mary..*lamb" poem.txt |
Первая точка в третьем выражении соответствует отдельный символ. Точечная звездочка впоследствии соответствует быть нулем или большим количеством дополнительных символов. Таким образом эти три оператора эквивалентны.
Заключительный полезный оператор повторения является оператором вопросительного знака (?
). Этот оператор соответствует нуль или повторения того, что предшествует ему.
Например, если Вы хотите соответствовать и Мэри и Жениться, Вы могли бы использовать выражение как это:
# Expression (Basic): /Marr\?y/ |
# Expression (Extended): /Marr?y/ |
grep "Marr\?y" poem.txt |
grep -E "Marr?y" poem.txt |
Вопросительный знак заставляет предыдущий r быть дополнительным, и таким образом, это выражение строки соответствий, содержащие или «Мэри» или «Жениться».
Таким образом, основной подстановочный знак и операторы повторения:
период (
.
) — подстановочный знак; соответствует отдельный символ.вопросительный знак (
\?
или?
) — соответствия 0 или 1 из предыдущего символа, группировки или подстановочного знака. (Этот оператор отличается в зависимости от того, используете ли Вы основные или расширенные регулярные выражения.)звездочка (
*
) — нуль соответствий или больше предыдущего символа, группировки или подстановочного знака.плюс (
\+
или+
) — соответствия один или больше предыдущего символа, группировки или подстановочного знака. (Этот оператор отличается в зависимости от того, используете ли Вы основные или расширенные регулярные выражения.)
Классы символов и группы
Поиск определенных ключевых слов может быть полезным, но это достаточно часто. Часто полезно искать присутствие или отсутствие ключевых символов в данной позиции в строке поиска.
Например, предположите, что Вы требуете, чтобы слова Мэри и ягненок были в том же предложении. Чтобы сделать это, необходимо только позволить определенным символам появляться между этими двумя словами. Это может быть достигнуто с помощью классов символов.
Существует два основных типа классов символов: предопределенные классы символов и пользовательские, или определяемые пользователем классы символов. Они описаны в следующих разделах.
Предопределенные классы символов
Наиболее языки регулярных выражений поддерживают некоторую форму предопределенных классов символов. Когда используется между скобками, они определяют обычно используемые наборы символов. Наиболее широко поддерживаемый набор предопределенных классов символов является классами символов POSIX:
[:alnum:]
— все алфавитно-цифровые символы (a-z, A-Z, и 0-9).[:alpha:]
— все буквенные символы (a-z, A-Z).[:blank:]
— весь пробел в строке (пробелы или вкладки).[:cntrl:]
— все управляющие символы (ASCII 0-31).[:digit:]
— все числа.[:graph:]
— все алфавитно-цифровые символы или знаки препинания.[:lower:]
— все строчные буквы (a-z).[:print:]
— все печатаемые символы (противоположность[:cntrl:]
, то же как объединение[:graph:]
и[:space:]
).[:punct:]
— все знаки препинания[:space:]
— все пробельные символы (пространство, вкладка, новая строка, возврат каретки, перевод формата и вертикальная вкладка). (См. примечание ниже о совместимости.)[:upper:]
— все прописные буквы.[:xdigit:]
— все шестнадцатеричные цифры (0-9, a-f, A-F).
Например, следующее является другим способом соответствовать любое предложение, содержащее Мэри и ягненка (но не, если существуют знаки препинания между ними):
# Expression: /Mary[[:alpha:][:digit:][:blank:]][[:alpha:][:digit:][:blank:]]*lamb/ |
grep 'Mary[[:alpha:][:digit:][:blank:]][[:alpha:][:digit:][:blank:]]*lamb' poem.txt |
Пользовательские классы символов
В дополнение к предопределенным классам символов языки регулярных выражений также позволяют пользовательские, определяемые пользователем классы символов. Эти пользовательские классы символов просто похожи на список символов, окруженных квадратными скобками.
Например, если Вы только хотите позволить пробелы и буквы, Вы могли бы создать класс символов как этот:
# Expression: /Mary[a-z A-Z]*lamb/ |
grep "Mary[a-z A-Z]*lamb" poem.txt |
В этом примере существует два диапазона (‘a
'через'z
'и'A
'через'Z
’) позволенный, а также пробел. Таким образом любая буква или пространство соответствуют этот образец, но другие вещи (включая символ точки) не делают. Таким образом эта строка соответствует первую строку стихотворения, но не соответствует более позднюю строку, начинающуюся «с Мэри, был женат».
Однако этот образец также не соответствовал строку, содержащую запятую, которая не была действительно намерением. Если Вы хотите включать высокие символы ASCII, управляющие символы и другие потенциально непечатные символы, перечисление каждого разумного диапазона символов с единственным пропуском было бы предельно большим, особенно.
К счастью, существует другой специальный оператор, каре (^
). Когда помещено как первый символ класса символов, соответствие инвертируется. Таким образом следующее выражение соответствует любой символ кроме периода:
# /Mary[^.]*lamb/ |
grep "Mary[^.]*lamb" poem.txt |
Группировка операторов
Как упомянуто ранее, регулярные выражения также имеют понятие группировки. Цель сгруппироваться состоит в том, чтобы обработать многократные символы как единственный объект, обычно в целях изменения того объекта с повторным оператором. Эта группировка сделана с помощью круглых скобок или заключенных в кавычки круглых скобок, в зависимости от используемого диалекта регулярного выражения.
Например, скажите, что Вы хотите искать любую строку, содержащую слово «Mary», сопровождаемое дополнительно словом, “имел", сопровождаемый Word «a». Вы могли бы записать это выражение как это:
#Expression (Basic): /Mary \(had \)\?a/ |
#Expression (Extended): /Mary (had )?a/ |
grep "Mary \(had \)\?a" poem.txt |
grep -E "Mary (had )?a" poem.txt |
Можно также использовать группирующийся синтаксис для предоставления многократных возможностей, любая из которых обрабатывается как соответствие. Выражения, включенные в круглые скобки, соответствуют любую из серии меньших выражений, разделенных каналом (|
) оператор. Например, для поиска Мэри, ягненка, или имело, Вы могли бы использовать это выражение:
#Expression (Basic): /\(Mary\|had\|lamb\)/ |
#Expression (Extended): /(Mary|had|lamb)/ |
grep '\(Mary\|had\|lamb\)' poem.txt |
grep -E '(Mary|had|lamb)' poem.txt |
Поскольку регулярные выражения обычно соответствуют слева направо, необходимо быть осторожными при работе с многократными опциями, которые являются подстроками друг друга во время замены и убеждаться поместить большие из возможных соответствий сначала. В то время как другие механизмы регулярного выражения всегда берут крайнее левое соответствие, некоторые механизмы регулярного выражения всегда берут более длительное соответствие.
Например, следующие строки дают тот же результат:
sed -E 's/(lamb|lamb,)/orange/' poem.txt |
sed -E 's/(lamb,|lamb)/orange/' poem.txt |
Однако, следующие строки не делают:
perl -pi.bak -e 's/(lamb|lamb,)/orange/' < poem.txt |
perl -pi.bak -e 's/(lamb,|lamb)/orange/' < poem.txt |
В Perl, когда ввод содержит слово «ягненок», сопровождаемый запятой, механизм регулярного выражения соответствует слову «ягненка» сначала, потому что это - крайняя левая опция. Это заменяет его «оранжевым» словом и оставляет запятую. Во второй опции, потому что версия с запятой соответствует сначала, удалена запятая, если это там.
Можно, конечно, также избежать этой проблемы путем записи выражения как:
perl -pi.bak -e 's/lamb,?/orange/' < poem.txt |
Используя пустые подвыражения
Иногда, при работе с группами, можно счесть необходимым включать дополнительную группу. Может быть заманчиво записать такое выражение как это:
# Expression (Extended): /const(ant|ellation|) (.*)/ |
В нечетной причуде, однако, некоторые инструменты командной строки не ценят пустое подвыражение. Существует два способа решить это.
Самый простой путь состоит в том, чтобы сделать всю группу дополнительной как это:
# Expression (Extended): /const(ant|ellation)? (.*)/ |
grep -E 'const(ant|ellation)? (.*)' |
Поочередно, пустое выражение может быть вставлено после вертикальной панели.
# Expression (Extended): /const(ant|ellation|()) (.*)/ |
grep -E "const(ant|ellation|()) (.*)" poem.txt |
Заключение в кавычки специальных символов
Как замечено в предыдущих разделах, много символов имеют особое значение в регулярных выражениях. Например, классы символов окружаются квадратными скобками, и символы тире и символы вставки имеют особое значение. Вы могли бы спросить, как можно искать один из этих символов. Это - то, где входит заключение в кавычки.
В регулярных выражениях определенные символы небуквы могут иметь некоторое особое значение, в зависимости от контекста. Для обработки этих символов как обычного символа можно снабдить префиксом их символ наклонной черты влево (\
). Это также означает, что символ наклонной черты влево является особенным в любом контексте, так для соответствия литерального символа наклонной черты влево, необходимо заключить его в кавычки со второй наклонной чертой влево.
Существует одно исключение, как бы то ни было. Чтобы заставить закрывающую квадратную скобку быть элементом класса символов, Вы не заключаете его в кавычки. Вместо этого Вы заставляете его быть первым символом в классе.
Например, для поиска любой строки, содержащей наклонную черту влево или закрывающую квадратную скобку, Вы могли бы использовать следующее регулярное выражение:
# Expression: /[]\\]/ |
grep '[]\\]' poem.txt |
Это выглядит немного загадочным, но это действительно относительно прямо. Внешние наклонные черты разграничивают регулярное выражение. Скобки сразу во внешних наклонных чертах являются разделителями класса символов. Первая закрывающая квадратная скобка сразу следует за открытой скобкой, заставляющей ее соответствовать фактический символ закрывающей квадратной скобки вместо того, чтобы закончить класс символов. Эти две наклонных черты влево впоследствии являются, фактически, заключенной в кавычки наклонной чертой влево, заставляющей этот класс символов соответствовать литеральный символ наклонной черты влево.
Как правило, по крайней мере в расширенных регулярных выражениях, любой неалфавитно-цифровой символ может безопасно быть заключен в кавычки, необходимо ли сделать так или нет. Если заключение в кавычки его не необходимо, дополнительная наклонная черта влево просто проигнорирована. Однако не всегда безопасно заключить в кавычки буквы или числа, поскольку они имеют особые значения на определенных диалектах регулярного выражения, как описано в Получении Операторов и Переменных и Расширений Python и Perl. Кроме того, заключение в кавычки круглых скобок может не сделать то, что Вы могли бы ожидать на некоторых диалектах, как описано в Получении Операторов и Переменных.
В основных регулярных выражениях поведение при заключении в кавычки символов кроме круглых скобок, изогнутых фигурных скобок, числа и символы в классе символов не определены.
Получение операторов и переменных
В Подстановочных знаках и Операторах Повторения, эта глава описала способы создать более сложные образцы для соответствия для поисковой части работы замены и поиска. В этом разделе описываются более мощные операции для заменяющей части работу замены и поиска.
Получение операторов и переменных используется, чтобы взять части исходного входного текста, получить их при поиске, и затем заменить теми битами в середину текста замены.
Самый простой способ объяснить операторов получения и переменные на примере. Предположим, что Вы хотите подкачать слова, быстрые и ленивые в строке, «Быстрая коричневая лиса перепрыгнула через ленивую собаку». Вы могли бы записать выражение как это:
# Expression (Basic): s/The \(.*\) brown \(.*\) the \(.*\) dog/The \3 brown \2 the \1 dog/ |
# Expression (Extended): s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/ |
Когда Вы передаете эти выражения sed
, последняя строка poem.txt
должен стать «Ленивой коричневой лисой, перепрыгнул через быструю собаку».
# Expression (Basic): s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/ |
sed "s/The \(.*\) brown \(.*\) the \(.*\) dog/The \3 brown \2 the \1 dog/" < poem.txt |
# Expression (Extended): s/The \(.*\) brown \(.*\) the \(.*\) dog/The \3 brown \2 the \1 dog/ |
sed -E "s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/" < poem.txt |
# Perl supports extended form, but also supports |
# using a dollar sign for the variable name. (Note |
# the use of single quotes to prevent the shell from |
# doing variable substitution on $1, $2, and $3.) |
perl -pi.bak -e "s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/" < poem.txt |
perl -pi.bak -e 's/The (.*) brown (.*) the (.*) dog/The $3 brown $2 the $1 dog/' < poem.txt |
Содержание между каждой парой круглых скобок (в этом случае — видят примечание) получено в его собственный буфер, пронумерованный последовательно. Таким образом, в этом выражении, содержание между и «коричневый» получено в буфер. Затем содержание между «коричневым» и полученного. Наконец, содержание между и «собака» получено.
В замещающей строке вставляются слова разделителя («коричневый», и «собака»), и содержание накопительных буферов вставляется в противоположный порядок.
Смесительное получение и группировка операторов
Так как круглые скобки служат и получающими и группирующимися операторами, использование группировки может привести к неожиданным последствиям при получении текста в том же выражении. Например, следующее выражение будет вести себя очень по-другому в зависимости от ввода:
# Expression /const(ant)? (.*)/ |
Текст, который Вы, вероятно, намеревались получить, находится во втором буфере, не первом.
Используя модификаторы
Полное поведение регулярного выражения может быть настроено с помощью многих модификаторов. Например:
/foo/i |
В этом примере, /i
модификатор заставляет регулярное выражение соответствовать нечувствительным к регистру способом. Таким образом это соответствует и «Фу» и «fOo».
Не все команды и языки поддерживают все модификаторы. Например, большинство версий sed
поддержка команды только /g
модификатор.
Основные модификаторы:
/g
— замените глобально. Без этого флага команда замены заменяет только первое возникновение соответствия на строку. С этим флагом команда замены также заменяет последующие соответствия./i
— вариант использования нечувствительное соответствие (расширение Perl; эквивалентныйgrep -i
)./m
— мультилиния, соответствующая (расширение Perl).$
и^
привязки должны соответствовать на границах новой строки в дополнение к соответствию вначале конца строки в целом. Точка (.
) не соответствует символы новой строки./o
— скомпилируйте один раз (расширение Perl). В Perl, если регулярное выражение включает переменную как часть образца, механизм регулярного выражения должен перекомпилировать выражение каждый раз, когда это используется, потому что, возможно, изменилось переменное содержание.Если Вы знаете, что содержание не изменится после того, как они будут установлены в первый раз,
/o
флаг отключает перекомпиляцию выражения. Для регулярных выражений, не содержащих переменные, этот переключатель не имеет никакого эффекта./s
— одна строка, соответствующая (расширение Perl).$
и^
привязки не должны соответствовать на границах новой строки. С этим модификатором они только соответствуют в самом начале и конце строки в целом. Точка (.
) символы новой строки соответствий точно так же, как любой другой символ./x
— расширьте удобочитаемость (расширение Perl). Этот режим заставляет соответствие игнорировать весь пробел между маркерами в выражении, если не заключено в кавычки или обернуто в скобках (на большинстве языков) и обрабатывать знак «диез» (#
) как запуск однострочного комментария.Цель этого режима состоит в том, чтобы позволить Вам разделять сложные регулярные выражения на многократные строки. Например, в Perl, Вы могли бы обнаружить дату как это:
if ($foo =~ /(\d\d\d\d) # year
\s*-\s* # separator
(\d\d) # month
\s*-\s* # separator
(\d\d) # day
/x) {
print "Date detected\n";
}
Синтаксические подробные данные варьируются от языка до языка.
Perl и расширения Python
Диалект регулярного выражения, используемый в Perl, Python, и многих других языках, является дальнейшим расширением расширенных регулярных выражений. Некоторые существенные различия включают:
Добавление ярлыков для классов символов. Посмотрите Ярлыки Класса символов.
Добавление операторов котировки. В регулярном выражении, содержании переменных, появляющихся между
\Q
и\E
автоматически заключаются в кавычки, и таким образом обрабатываются как буквенный текст, даже если переменная содержит символы, обычно имеющие особое значение в регулярном выражении. Когда ввод данных пользователем, сохраненный в переменной Perl, используется в качестве части регулярного выражения, эти операторы полезны.Поддержка получения полученных значений вне объема выражения; полученные значения сохранены в переменных
$1
,$2
, и т.д. (См. Операторов Получения и Переменные для получения информации о получении частей регулярного выражения.)Добавление нежадного соответствия. Посмотрите, что Нежадный Подстановочный знак Соответствует для получения дополнительной информации.
Неполучение круглых скобок. Посмотрите Круглые скобки Неполучения для получения дополнительной информации.
Можно найти ссылки к дополнительным ресурсам, описывающим эти расширения в Для получения дополнительной информации.
Ярлыки класса символов
Регулярные выражения Perl добавляют много дополнительных ярлыков класса символов. Некоторые из них упоминаются ниже:
\A
— привязки, соответствующие к началу строки в целом (но не началу строк в строке).Этот ярлык широко не поддерживается за пределами Perl. На других языках использовать
^
и добавьте/s
модификатор (или не указывают/m
модификатор, завися) для указания соответствия строки сразу.\b
— граница слова (см. примечание).\B
— граница неслова (см. примечание).\d
— эквивалентный [: цифра:].\D
— эквивалентный [^:digit:].\f
— перевод формата.\n
— новая строка.\p
— символ, соответствующий следующее свойство символа Unicode. Например,\p{L}
соответствует букву Unicode.\P
— символ не соответствие следующего свойства Unicode. Например,\P{L}
соответствия любой символ Unicode, который не является буквой.\r
— возврат каретки.\s
— эквивалентный [: пространство:].\S
— эквивалентный [^:space:].\t
— вкладка.\u
— единственный символ Unicode в регулярных выражениях JavaScript. Этот ярлык должен сопровождаться четырьмя шестнадцатеричными цифрами.\v
— вертикальная вкладка.\w
— эквивалентный [: слово:].\W
— эквивалентный [^:word:].\x
— запустите кода символа ASCII (в шестнадцатеричном числе). Например, \x20 является пространством.\X
— единственный символ Unicode (не поддерживаемый универсально). Этот ярлык должен сопровождаться четырьмя шестнадцатеричными цифрами.\z
— привязки, соответствующие до конца строки в целом (но не конец строк в строке).Этот ярлык широко не поддерживается за пределами Perl. На других языках использовать
$
и добавьте/s
модификатор (или не указывают/m
модификатор, завися) для указания соответствия строки сразу.\Z
— привязки, соответствующие до конца строки в целом (но не конец строк в строке). Если строка заканчивается разрывом строки, на некоторых языках (включая Perl), это соответствует до заключительного разрыва строки. Для предотвращения этого использовать\z
вместо этого.Этот ярлык широко не поддерживается за пределами Perl. На других языках использовать
$
и добавьте/s
модификатор для указания соответствия строки сразу.
Они могут использоваться где угодно на левой стороне регулярного выражения, включая в классах символов.
Нежадное подстановочное соответствие
По умолчанию повторите, что операторы являются жадными, соответствуя максимально много раз прежде, чем попытаться соответствовать следующую часть строки. Это будет обычно приводить к самой длинной строке, соответствующей выражение в целом. В некоторых случаях можно хотеть, чтобы соответствие остановилось в самой короткой строке, соответствующей все выражение.
Для поддержки этого регулярные выражения Perl (вместе со многими другими диалектами) поддерживают нежадное подстановочное соответствие. Для преобразования жадного повторного оператора в нежадного повторного оператора Вы просто добавляете вопросительный знак после него.
Например, полагайте, что детский стих “Мэри имел немного ягненка, его флис был белым как снег, и везде что Мэри пошла, ягненок, несомненно, пошел бы”. Предположите применение следующего выражения:
/Mary.*lamb/ |
То выражение соответствия “Мэри имели немного ягненка, его флис, было белым как снег, и везде что Мэри пошла, ягненок”.
Предположим, что вместо этого, Вы хотите найти самую короткую строку, начинающуюся с «Мэри» и заканчивающуюся «ягненком». Вы могли бы вместо этого использовать следующее выражение:
То выражение соответствует, только слова “Мэри имели немного ягненка”. +?
оператор ведет себя так же.
Неполучение круглых скобок
Можно заметить, что синтаксис для получения идентичен синтаксису для группировки описанного в Операторах Повторения и Подстановочных знаках. В большинстве случаев дополнительные получения не являются проблемой. Если Вы используете круглые скобки просто в качестве инструмента группировки, Однако в некоторых случаях (особенно при разделении строк на массивы в Perl), можно хотеть избежать получать содержание.
Для выключения получения для данного набора круглых скобок добавьте вопросительный знак, сопровождаемый двоеточием после открывающей скобки.
Рассмотрите следующий пример:
# Expression (Perl and Similar ONLY): /Mary (?:had)* a little lamb\./ |
perl -pi.bak -e "s/Mary (?:had )*a little lamb\./Lovely day, isn't it?/" < poem.txt |
Это выражение соответствует «Мэри», сопровождаемой нулем (0), или больше экземпляров следовало “небольшим ягненком”, следовало к литеральному периоду и заменяет незаконную строку (“Мэри, имел немного ягненка”.) с “Прекрасным днем, не так ли?”.
Для получения дополнительной информации
В этой главе рассматривается регулярных выражений, поскольку они применяются к сценариям оболочки. В то время как это покрывает некоторые более интересные расширения, предоставленные языками, такими как Perl, это ни в коем случае не полная ссылка на регулярные выражения Perl.
Для полного объяснения регулярных выражений Perl и дополнительных функций и причуд в различных языках программирования, посмотрите http://perldoc .perl.org/perlre.html и http://www .regular-expressions.info/.
Используя регулярные выражения в проверяют утверждения
Оболочка test
команда (описанный в тестовой Нотации Команды и Скобки) исходно не поддерживает регулярные выражения, поэтому для использования регулярных выражений в, проверяют утверждения, необходимо использовать в своих интересах возможность выполнить произвольные внешние команды (более в частности, grep
команда) вместо того, чтобы использовать нотацию скобки.
Как показано всюду по этой главе, grep
команда берет поток текста (или путь или список путей) и распечатывает каждую строку, соответствующую указанное регулярное выражение. То, что Вы могли не заметить, однако, то, что его статус выхода изменяется в зависимости от того, соответствует ли ввод указанное выражение.
grep
команда выходит с успешным статусом выхода (0
) если ввод соответствует указанное выражение, по крайней мере, один раз или неработающий статус выхода (обычно 1
) если не соответствует образец. Таким образом можно легко использовать его для управления if
оператор.
Например:
if (echo "$MYVAR" | grep "bar" > /dev/null) ; then |
echo "The value of MYVAR ($MYVAR) contains \"bar\"." |
fi |
В вышеупомянутом примере, самый правый статус выхода (от grep
) обрабатывается как статус выхода для группы команд (предполагающий, что echo
команда успешно выполняется, который она всегда должна). Перенаправление к /dev/null
препятствует тому, чтобы текстовый вывод был распечатан на экран пользователя.
Регулярные выражения могут также использоваться в другом проверять утверждения такой как while
циклы. Например, следующий отрывок считает случаи буквы 'x' в однострочной строке:
MYVAR="xxxxxx" |
while (echo "$MYVAR" | grep 'x' > /dev/null) ; do |
# Be sure to change MYVAR here! |
echo "got x" |
MYVAR="$(echo "$MYVAR" | sed -E 's/x//')" |
done |
Конечно, этот изобретенный отрывок является хорошим примером того, когда необходимо избежать регулярных выражений; тестирование на пустую строку заставляет этот отрывок работать примерно вдвое более быстрый.