扩展正则表达式(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 是默认模式(如 sedgrep 不加选项时):

    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:GNU sed-E,BSD sed-E-r
    • grep:用 -Eegrep
    • 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/'

掌握两种模式的差异,能更灵活地应对不同工具和场景!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐