正则表达式与 grep 与egrep

正则表达式与 grep 与egrep

有人能解释一下以下表达式的含义吗grep?这与 有何不同egrep

grep

  1. ^[0-9]\+$
  2. [0-9]\{3\}.*[0-9]\{3\}
  3. ^.*[0-9]$

egrep

  1. ^[0-9]{7}$
  2. ^.*$

答案1

egrepgrep作为70 年代末 Unix V7 中的一个新实现,它使用了新的正则表达式引擎和语法(awk也发布了 V7,使用相同的新扩展正则表达式 (ERE) 语法,而不是grep//使用的语法)。从那时起,POSIX 将命令的功能合并到选项中,并弃用了.edsedegrepgrep-Eegrep

如今,在某些系统上,egrep它只是一个sh-script ,它只做类似的事情exec grep -E "$@",只是为了向后兼容,以适应尚未更新使用的脚本grep -E

$ cat /usr/bin/egrep
#!/bin/sh
exec grep -E "$@"

所以,egrep根本grep -E没有任何区别。


用于^行起点锚点,相应地也$用于行尾锚点。
[0-9]与您的语言环境中 0 到 9 范围内的整理元素相匹配。过去只包括 0123456789,但根据系统和区域设置可能包括更多。
{min,Max}是已知的区间表达式。
.*匹配任何 0 个或多个字符的序列。

ERE(如egrep/ awk)引入了一些新的运算符:+? 和,|并删除了反向引用支持。

BRE 中的分组运算符\(...\)(在 中使用的基本正则表达式grep)位于(...)ERE 中。

正则表达式最初没有间隔运算符。它们首先是在 BRE 中添加的\{x,y\},但不是在 ERE 中添加的,因为这样做会破坏向后兼容性。这被 P​​OSIX 改变了,POSIX{x,y}在 90 年代确实指定了 ERE。直到今天,仍然有egrep一些awk实现不支持它。

GNU 实现grep(以及使用 BRE 的其他实用程序)更进一步,将+, ?, |ERE 运算符添加到 BRE 中,作为\+, \?\|并且支持使用 ERE ( ) 进行反向引用grep -E作为一致性的非标准扩展,因此在这些实现中,BRE和 ERE 在功能上是等效的,只是语法不同。

也可以看看为什么我的正则表达式在 X 中有效但在 Y 中无效?

在这里https://www.regular-expressions.info/posix.html#bre我还发现了有关 ERE/BRE 的非常好的信息以及更多信息;

我也从这里找到了这个正则表达式比较https://www.regular-expressions.info/refrepeat.html非常有用,将其中的 4 个组合如下:

特征 句法 描述                                                                   例子 GNU 布雷 GNU ERE POSIX BRE POSIX ERE
贪心量词 ? (问号) 使前面的项目可选。贪婪,所以如果可能的话,可选项目包含在匹配中。 abc?匹配 abc 或 ab 是的 是的
贪心量词 使前面的项目可选。贪婪,所以如果可能的话,可选项目包含在匹配中。 abc?匹配 abc 或 ab 是的
贪心量词 * (星星) 重复前一项零次或多次。贪婪,因此在尝试与前一个项目匹配较少的排列之前,将匹配尽可能多的项目,直到前一个项目根本不匹配。 ".*" 匹配 abc "def" "ghi" jkl 中的 "def" "ghi" 是的 是的 是的 是的
贪心量词 +(加号) 重复前一项一次或多次。贪婪,因此在尝试与前一项匹配较少的排列之前,将匹配尽可能多的项目,直到前一项仅匹配一次。 ".+" 匹配 abc "def" "ghi" jkl 中的 "def" "ghi" 是的 是的
贪心量词 + 重复前一项一次或多次。贪婪,因此在尝试与前一项匹配较少的排列之前,将匹配尽可能多的项目,直到前一项仅匹配一次。 ".+" 匹配 abc "def" "ghi" jkl 中的 "def" "ghi" 是的
固定量词 {n} 其中 n 是 >= 1 的整数 准确地重复前一项 n 次。 a{3} 匹配 aaa 是的 是的
贪心量词 {n,m} 其中 n >= 0 且 m >= n 重复前一项 n 到 m 次。贪婪,所以在将重复减少到n次之前尝试重复m次。 a{2,4} 匹配 aaaa、aaa 或 aa 是的 是的
贪心量词 {n,} 其中 n >= 0 重复前一项至少 n 次。贪婪,因此在尝试前一项的匹配较少的排列之前,将匹配尽可能多的项,直到前一项仅匹配 n 次。 a{2,} 匹配 aaaaa 中的 aaaaa 是的 是的
贪心量词 {,m} 其中 m >= 1 重复前一项零到 m 次。贪婪,所以在将重复减少到零次之前尝试重复m次。 a{,4} 匹配 aaaa、aaa、aa、a 或空字符串 是的
固定量词 {n} 其中 n 是 >= 1 的整数 准确地重复前一项 n 次。 a{3} 匹配 aaa 是的 是的
贪心量词 {n,m} 其中 n >= 0 且 m >= n 重复前一项 n 到 m 次。贪婪,所以在将重复减少到n次之前尝试重复m次。 a{2,4} 匹配 aaaa、aaa 或 aa 是的 是的
贪心量词 {n,} 其中 n >= 0 重复前一项至少 n 次。贪婪,因此在尝试前一项的匹配较少的排列之前,将匹配尽可能多的项,直到前一项仅匹配 n 次。 a{2,} 匹配 aaaaa 中的 aaaaa 是的 是的
贪心量词 {,m} 其中 m >= 1 重复前一项零到 m 次。贪婪,所以在将重复减少到零次之前尝试重复m次。 a{,4} 匹配 aaaa、aaa、aa、a 或空字符串 是的

相关内容