К сожалению, по историческим причинам разные инструменты имеют немного различающийся синтаксис регулярных выражений, а иногда некоторые реализации имеют расширения, которые не поддерживаются другими инструментами. Несмотря на то, что существует общий язык, кажется, что каждый автор инструмента сделал несколько разных выборов.
В результате, если у вас есть регулярное выражение, которое работает в одном инструменте, вам может потребоваться изменить его для работы в другом инструменте. Основные различия между общими инструментами:
+?|(){}
требуется ли операторам обратный слеш;
- какие расширения поддерживаются помимо базовых
.[]*^$
и обычно+?|()
В этом ответе я перечислю основные стандарты . Проверьте документацию инструментов, которые вы используете для деталей.
Сравнение механизмов регулярных выражений в Википедии содержит таблицу, в которой перечислены функции, поддерживаемые общими реализациями.
Основные регулярные выражения кодифицированы стандартом POSIX . Это синтаксис , используемый grep
, sed
и vi
. Этот синтаксис предоставляет следующие функции:
^
и $
совпадать только в начале и конце строки.
.
соответствует любому символу (или любому символу кроме новой строки).
[…]
соответствует любому одному символу, указанному в скобках (набор символов). Если первый символ после открывающей скобки является a ^
, символы, которые не перечислены, вместо этого сопоставляются. Чтобы включить ]
, поместите его сразу после открытия [
(или после, [^
если это отрицательный набор). Если -
между двумя символами, он обозначает диапазон; чтобы включить литерал -
, поместите его там, где он не может быть проанализирован как диапазон.
- Обратная косая черта перед любой из
^$.*\[
кавычек следующего символа.
*
соответствует предыдущему символу или подвыражению 0, 1 или более раз.
\(…\)
является синтаксической группой, для использования с *
оператором или обратными ссылками и \DIGIT
заменами.
- Обратные
\1
, \2
... соответствует точный текст , совпадающий по соответствующей группе, например , \(fo*\)\(ba*\)\1
матчи , foobaafoo
но не foobaafo
. Не существует стандартного способа обращения к 10-й группе и далее (стандартное значение \10
- первая группа, за которой следует a 0
).
Следующие функции также являются стандартными, но отсутствуют в некоторых ограниченных реализациях:
\{m,n\}
соответствует предыдущему символу или подвыражению от m до n раз; n или m могут быть опущены, и означает точно m .\{m\}
- Внутри скобок можно использовать классы символов , например, для
[[:alpha:]]
совпадения с любой буквой. Современные реализации выражений в скобках ) также включают в себя сопоставление элементов like [.ll.]
и классов эквивалентности like [=a=]
.
Ниже приведены общие расширения (особенно в инструментах GNU), но они встречаются не во всех реализациях. Проверьте руководство по инструменту, который вы используете.
\|
для чередования: foo\|bar
совпадения foo
или bar
.
\?
(сокращение от \{0,1\}
) и \+
(сокращение от \{1,\}
) соответствуют предыдущему символу или подвыражению не более 1 раза или не менее 1 раза соответственно.
\n
соответствует новой строке, \t
соответствует вкладке и т. д.
\w
соответствует любому компоненту слова (сокращенно, [_[:alnum:]]
но с изменением, когда дело доходит до локализации) и \W
соответствует любому символу, который не является компонентом слова.
\<
и \>
сопоставлять пустую строку только в начале или конце слова соответственно; \b
соответствует либо, и \B
соответствует, где \b
нет.
Обратите внимание, что инструменты без \|
оператора не имеют полной мощности регулярных выражений. Обратные ссылки допускают несколько дополнительных вещей, которые нельзя сделать с помощью регулярных выражений в математическом смысле.
Расширенные регулярные выражения кодифицированы стандартом POSIX . Их главное преимущество перед BRE - регулярность: все стандартные операторы - это символы пунктуации, обратная косая черта перед знаком препинания всегда в кавычках. Это синтаксис , используемый awk
, grep -E
или egrep
, GNU sed -r
, и Bash=~
- оператор. Этот синтаксис предоставляет следующие функции:
^
и $
совпадать только в начале и конце строки.
.
соответствует любому символу (или любому символу кроме новой строки).
[…]
соответствует любому одному символу, указанному в скобках (набор символов). Дополнение с начальным ^
и диапазоном работает как в BRE (см. Выше). Символьные классы могут использоваться, но отсутствуют в нескольких реализациях. Современные реализации также поддерживают классы эквивалентности и элементы сопоставления. Обратная косая черта в скобках заключает в кавычки следующий символ в некоторых, но не во всех реализациях; использовать \\
для обозначения обратной косой черты для переносимости.
(…)
является синтаксической группой, для использования *
или \DIGIT
замены.
|
для чередования: foo|bar
совпадения foo
или bar
.
*
, +
И ?
соответствует предыдущему символу или подвыражения несколько раз: 0 или более для *
, 1 или более для +
0 или 1 для ?
.
- Обратная косая черта заключает в кавычки следующий символ, если он не алфавитно-цифровой.
{m,n}
соответствует предыдущему символу или подвыражению между m и n разами (отсутствует в некоторых реализациях); n или m могут быть опущены, и означает точно m .{m}
- Некоторые распространенные расширения, как в BRE: обратные ссылки (особенно отсутствуют в awk, за исключением реализации busybox, где вы можете использовать ); специальные символы , и т.д .; границы слова и , составляющие слова и ,…
\DIGIT
$0 ~ "(...)\\1"
\n
\t
\b
\B
\b
\B
PCRE (Perl-совместимые регулярные выражения)
PCRE - это расширения ERE, изначально представленные Perl и принятые GNU, grep -P
и многие современные инструменты и языки программирования , обычно через библиотеку PCRE . Смотрите документацию Perl для хорошего форматирования с примерами. PCRE поддерживает не все функции последней версии Perl (например, выполнение кода Perl поддерживается только в Perl). См. Руководство по PCRE для получения краткого описания поддерживаемых функций. Основными дополнениями к ERE являются:
(?:…)
является не захватывающей группой: нравится (…)
, но не учитывает обратные ссылки.
(?=FOO)BAR
(lookahead) совпадения BAR
, но только если есть совпадение для FOO
старта в той же позиции. Это наиболее полезно для привязки совпадения без включения в него следующего текста: foo(?=bar)
совпадения, foo
но только если за ним следует bar
.
(?!FOO)BAR
(отрицательный взгляд) совпадает BAR
, но FOO
в той же позиции также нет совпадения . Например, (?!foo)[a-z]+
соответствует любому строчному слову, которое не начинается с foo
; [a-z]+(?![0-9)
соответствует любому слову в нижнем регистре, за которым не следует цифра (поэтому foo123
оно совпадает, fo
но не совпадает foo
).
(?<=FOO)BAR
(lookbehind) совпадает BAR
, но только если ему непосредственно предшествует совпадение для FOO
. FOO
должен иметь известную длину (вы не можете использовать операторы повторения, такие как *
). Это наиболее полезно для привязки совпадения без включения предыдущего текста в совпадение: (?<=^| )foo
совпадения, foo
но только если ему предшествует пробел или начало строки.
(?<!FOO)BAR
(отрицательный взгляд сзади) совпадает BAR
, но только если ему не предшествует совпадение с FOO
. FOO
должен иметь известную длину (вы не можете использовать операторы повторения, такие как *
). Это наиболее полезно для привязки совпадения без включения предыдущего текста в совпадение: (?<![a-z])foo
совпадения, foo
но только если ему не предшествует строчная буква.
Emacs
Синтаксис Emacs является промежуточным между BRE и ERE. В дополнение к Emacs, это синтаксис по умолчанию для -regex
поиска в GNU. Emacs предлагает следующие операторы:
^
, $
, .
, […]
, *
, +
, ?
Как и в ERE
\(…\)
, \|
, \{…\}
, Как и в BRE\DIGIT
- больше последовательностей букв обратной косой черты ;
\<
и \>
для границ слова; и многое другое в последних версиях Emacs, которые часто не поддерживаются в других движках с Emacs-подобным синтаксисом.
Глобусы оболочки (подстановочные знаки) выполняют сопоставление с шаблоном с использованием синтаксиса, который полностью отличается от регулярных выражений и менее эффективен. В дополнение к оболочкам эти подстановочные знаки доступны с другими инструментами, такими как find -name
и фильтры rsync. Шаблоны POSIX включают в себя следующие функции:
?
соответствует любому отдельному символу.
[…]
является набором символов как в общих синтаксисах регулярного выражения. Некоторые оболочки не поддерживают классы персонажей. Некоторые оболочки требуют !
вместо того, ^
чтобы отрицать множество.
*
соответствует любой последовательности символов (часто за исключением случаев, /
когда сопоставляются пути к файлам; если /
исключен из *
, то **
иногда включает /
, но проверяет документацию инструмента).
- Обратная косая черта указывает на следующий символ.
Ksh предлагает дополнительные функции, которые дают его шаблону полную мощность регулярных выражений. Эти функции также доступны в bash после запуска shopt -s extglob
. Zsh имеет другой синтаксис, но может также поддерживать синтаксис ksh после setopt ksh_glob
.
vim
это и AT & T libast (как вksh93
).grep
,tw
,expr
...). За исключением тогоksh
, что этот набор инструментов редко находится за пределами AT & T, хотя.regex(7)
соглашается с вами и называет[these]
«скобочные выражения» и (в рамках «скобочных выражений»)[:these:]
«классы символов». Я не уверен, как лучше решить эту проблему.-
указывает диапазон и должен быть либо экранирован, либо первым (после необязательного^
), либо последним, если его следует понимать буквально. (Я видел много ошибок , обусловленных , например ,[A-z]
-ПРИМЕЧАНИЕ изменения в прецедентной, который соответствует символы кодов 65 до 122 и случайно включает в себя каждый из:[\]^_`
. Я также видел , действительный еще запутанным ,[!-~]
чтобы соответствовать все печатаемые символы в ANSI который я предпочитаю видеть как[\x21-\x7e]
, который по крайней мере прост в своих действиях, хотя и запутывает в другом измерении.)