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

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

Является ли стандарт регулярных выражений, используемый в grep?POSIX + ASCIIили что-то еще примешано?

решение1

Все зависит от того, какие флаги вы передаете grep.

Обычная команда grep без флагов (которая эквивалентна передаче -G) использует «базовые регулярные выражения»:

-G, --basic-regexp
    Interpret PATTERN as a basic regular expression (BRE, see 
    below).  This is the default.

Если указать -E, будут использоваться «расширенные» регулярные выражения:

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (ERE, 
    see below).  (-E is specified by POSIX.)

А затем у вас есть -P для регулярных выражений Perl (PCRE):

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.

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

В основных регулярных выражениях метасимволы ?, +, {, |, (и )теряют свое особое значение; вместо них используются версии с обратной косой чертой \?, \+, \{, \|, \(, и \).

Традиционный egrep не поддерживает {метасимвол, но некоторые реализации egrep поддерживают \{его, поэтому в переносимых скриптах следует избегать {шаблонов grep -E и использовать [{]для сопоставления литерала {.

GNU grep -E пытается поддерживать традиционное использование, предполагая, что это {не является чем-то особенным, если это начало недопустимой спецификации интервала. Например, команда grep -E '{1' ищет двухсимвольную строку {1вместо того, чтобы сообщать об ошибке синтаксиса в регулярном выражении. POSIX.2 допускает такое поведение как расширение, но переносимые скрипты должны избегать этого.

Поэтому, хотя grep стремится быть максимально приближенным к POSIX, в нем все еще есть некоторые недостатки.

Связанный контент