有人能解释一下以下表达式的含义吗grep
?这与 有何不同egrep
?
和grep
:
^[0-9]\+$
[0-9]\{3\}.*[0-9]\{3\}
^.*[0-9]$
和egrep
:
^[0-9]{7}$
^.*$
答案1
egrep
grep
作为70 年代末 Unix V7 中的一个新实现,它使用了新的正则表达式引擎和语法(awk
也发布了 V7,使用相同的新扩展正则表达式 (ERE) 语法,而不是grep
//使用的语法)。从那时起,POSIX 将命令的功能合并到选项中,并弃用了.ed
sed
egrep
grep
-E
egrep
如今,在某些系统上,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 中添加的,因为这样做会破坏向后兼容性。这被 POSIX 改变了,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 或空字符串 | 是的 | 不 | 不 | 不 |