扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)的区别
·
扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)是正则表达式的两种语法标准,主要区别在于元字符的行为和是否需要转义。以下是核心区别和示例:
1. 元字符的默认行为
| 元字符 | BRE 行为 | ERE 行为 |
|---|---|---|
( ) | 普通字符,需转义为 \( \) 表示分组 | 直接表示分组,无需转义 |
{ } | 普通字符,需转义为 \{ \} 表示量词 | 直接表示量词(如 {n,m}),无需转义 |
+ | 普通字符,需转义为 \+ 表示“1次或多次” | 直接表示“1次或多次” |
? | 普通字符,需转义为 \? 表示“0次或1次” | 直接表示“0次或1次” |
| ` | ` | 普通字符,需转义为 | 表示“或”逻辑 |
2. 量词与分组
-
BRE 中:
匹配 “aaa” 或 “aaaa”
echo “aaa” | sed -n ‘/a{3,4}/p’ # 需转义 { }
分组并反向引用
echo “hello123” | sed ‘s/(hello)[0-9]+/\1/’ # 输出 “hello”
-
ERE 中(更简洁):
匹配 “aaa” 或 “aaaa”
echo “aaa” | grep -E ‘a{3,4}’
分组并反向引用
echo “hello123” | sed -E ‘s/(hello)[0-9]+/\1/’ # 输出 “hello”
3. 工具支持
-
BRE 是默认模式(如
sed、grep不加选项时):grep “a{3}” file.txt # BRE 模式
sed ‘s/a+/b/’ file.txt # BRE 需转义 + -
ERE 需显式启用(通过
-E或-r):grep -E “a{3}” file.txt # ERE 模式
sed -E ‘s/a+/b/’ file.txt # ERE 直接用 +
4. 其他差异
- 锚定符(如
^和$)在两者中行为一致。 - 字符类(如
[a-z]、\d)通常行为相同。 - 反向引用在 BRE 中通过
\1、\2引用分组,ERE 也支持(但语法更自由)。
使用建议
- 优先用 ERE:语法更简洁,可读性高(如
+、?、|无需转义)。 - 注意工具兼容性:
sed:GNUsed用-E,BSDsed用-E或-r。grep:用-E或egrep。awk默认使用 ERE。
示例对比
| 需求 | BRE 写法 | ERE 写法 |
|---|---|---|
| 匹配 “cat” 或 “dog” | cat|dog | `cat |
| 匹配 3~5 个数字 | [0-9]\{3,5\} | [0-9]{3,5} |
| 匹配 “a” 至少1次 | a\+ | a+ |
| 分组并替换 | sed 's/\(ab\)c/\1d/' | sed -E 's/(ab)c/\1d/' |
掌握两种模式的差异,能更灵活地应对不同工具和场景!
更多推荐
所有评论(0)