POSIX 扩展正则表达式(ERE)

POSIX 扩展正则表达式(ERE)相比基本正则表达式(BRE)去除了许多反斜杠(\)的使用,使语法更直观。在某些 Unix 工具(如 grepsed)中,可以通过 -E 选项启用 ERE,而 awk 默认使用 ERE。


主要区别

  1. 去掉了反斜杠 \

    • 在 BRE 中,\( … \)\{ … \} 分别用于定义捕获组重复匹配,但在 ERE 中,它们分别简化为 ( … ){ … }
    • 例如:
      • BRE: \(ab\)\{3,5\} 匹配 "ababab""abababab""ababababab"
      • ERE: (ab){3,5} 具有相同的匹配效果
  2. 增加了 +?| 这些元字符

    • 在 BRE 中,+?| 需要加反斜杠 \ 才能使用,而在 ERE 中直接可用:
      • BRE: a\+b\?c
      • ERE: a+b?c

示例

正则表达式 匹配内容
[hc]+at "hat""cat""hhat""chat""hcat""ccchat"
[hc]?at "hat""cat""at"
`([cC]at) ([dD]og)`
`a.(( ))`

贪婪(Greedy)与非贪婪(Non-Greedy)匹配

  • 默认情况下,重复匹配 *+{m,n}贪婪的**(尽可能匹配最长的内容):
    • ".*" 匹配字符串中最远"
  • 在某些现代工具(如 PerlPython)中,可使用 *?+??? 实现非贪婪**匹配:
    • ".*?" 只匹配最短"

元字符(Metacharacters)

元字符 描述
. 匹配任何单个字符(通常不包括换行符)
[ ] 字符类,匹配括号内任意单个字符,如 [abc] 可匹配 "a", "b", "c"
[^ ] 反向字符类,匹配不在括号内的字符,如 [^abc] 可匹配除 "a", "b", "c" 以外的字符
^ 匹配字符串起始位置
$ 匹配字符串结尾位置
egg 定义子表达式(捕获组),匹配的内容可在 \n 进行引用
\n 引用第 n 个子表达式n 范围 1-9
* 匹配前一个元素 0 次或多次,如 ab*c 可匹配 "ac""abc""abbbc"
+ 匹配前一个元素 1 次或多次,如 ab+c 可匹配 "abc""abbbc"
? 匹配前一个元素 0 或 1 次,如 ab?c 可匹配 "ac""abc"
` `
{m,n} 匹配前一个元素至少 m 次,至多 n
{m} 匹配前一个元素恰好 m
{m,} 匹配前一个元素至少 m
{,n} 匹配前一个元素至多 n

字符类

POSIX 规定了一些字符类别,可以在方括号 [] 内使用

POSIX 类 等效字符类 含义
[:upper:] [A-Z] 大写字母
[:lower:] [a-z] 小写字母
[:alpha:] [[:upper:][:lower:]] 字母(大写 + 小写)
[:alnum:] [[:alpha:][:digit:]] 字母和数字
[:digit:] [0-9] 数字
[:xdigit:] [0-9A-Fa-f] 十六进制数字
[:punct:] [.,!?:…] 标点符号
[:blank:] [ \t] 空格和 TAB
[:space:] [ \t\n\r\f\v] 所有空白字符(包括换行)
[:cntrl:] [控制字符] 控制字符(如 \n, \t 等)
[:graph:] [^\t\n\r\f\v] 可打印字符(不含空格)
[:print:] [^ \t\n\r\f\v] 可打印字符(含空格)

示例

正则表达式 匹配内容
a[[:digit:]]b 匹配 "a0b", "a1b", ..., "a9b"
[^ABZ[:lower:]] 匹配小写字母ABZ 以外的字符

适用工具

支持 POSIX 扩展正则表达式(ERE)的工具:

  • AWK(默认使用 ERE)
  • Grep(使用 -E 启用 ERE)
  • Sed(使用 -E 启用 ERE)

总结

  1. ERE 语法比 BRE 更简洁,去除了许多反斜杠 \ 的使用,例如:
    • \(ab\) 在 ERE 中写作 (ab)
    • a\{3,5\} 在 ERE 中写作 a{3,5}
  2. ERE 默认支持 +?|,这些在 BRE 中需要加 \
  3. ERE 广泛应用于 awkgrep -Esed -E,简化了复杂模式匹配
  4. ERE 仍然保持 POSIX 的标准字符类 [:digit:][:alpha:]

总结来说,POSIX 扩展正则表达式(ERE)是 BRE 的进化版本,使用更简洁的语法,使模式匹配更直观和高效。

Last modified: Thursday, 30 January 2025, 2:17 AM