grep 中使用了哪个正则表达式标准?

Den*_* S. 5 linux standards grep regex

grep POSIX + ASCII 中使用的正则表达式标准是否混入了其他内容?

Maj*_*nko 8

这一切都取决于您传递给 grep 的标志。

正常的无标志 grep(与传递 -G 相同)使用“基本正则表达式”:

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

如果您指定 -E 它使用“扩展”正则表达式:

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

然后你有 Perl 正则表达式 (PCRE) 的 -P:

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.
Run Code Online (Sandbox Code Playgroud)

基本与扩展正则表达式

在基本的正则表达式的元字符?+{|(,和)失去了特殊的意义; 改用反斜杠的版本\?\+\{\|\(,和\)

传统的 egrep 不支持{元字符,而一些 egrep 实现支持\{,因此可移植脚本应避免{使用 grep -E 模式,而[{]应用于匹配文字{.

GNU grep -E 试图通过假设它{是无效间隔规范的开始并不特殊来支持传统用法。例如,该命令 grep -E '{1' 搜索两个字符的字符串,{1而不是报告正则表达式中的语法错误。POSIX.2 允许将此行为作为扩展,但可移植脚本应避免它。

因此,尽管 grep 努力尽可能接近 POSIX,但它仍然存在一些缺陷。