正则表达式(Regular Expressions)
完成条件
POSIX 扩展正则表达式(ERE)
POSIX 扩展正则表达式(ERE)相比基本正则表达式(BRE)去除了许多反斜杠(\)的使用,使语法更直观。在某些 Unix 工具(如 grep、sed)中,可以通过 -E 选项启用 ERE,而 awk 默认使用 ERE。
主要区别
-
去掉了反斜杠
\- 在 BRE 中,
\( … \)和\{ … \}分别用于定义捕获组和重复匹配,但在 ERE 中,它们分别简化为( … )和{ … }。 - 例如:
- BRE:
\(ab\)\{3,5\}匹配"ababab"、"abababab"或"ababababab" - ERE:
(ab){3,5}具有相同的匹配效果
- BRE:
- 在 BRE 中,
-
增加了
+、?、|这些元字符- 在 BRE 中,
+、?、|需要加反斜杠\才能使用,而在 ERE 中直接可用:- BRE:
a\+b\?c - ERE:
a+b?c
- BRE:
- 在 BRE 中,
示例
| 正则表达式 | 匹配内容 |
|---|---|
[hc]+at |
"hat"、"cat"、"hhat"、"chat"、"hcat"、"ccchat" 等 |
[hc]?at |
"hat"、"cat" 和 "at" |
| `([cC]at) | ([dD]og)` |
| `a.(( | ))` |
贪婪(Greedy)与非贪婪(Non-Greedy)匹配
- 默认情况下,重复匹配
*、+、{m,n}是贪婪的**(尽可能匹配最长的内容):".*"匹配字符串中最远的"号
- 在某些现代工具(如
Perl、Python)中,可使用*?、+?、??实现非贪婪**匹配:".*?"只匹配最短的"号
元字符(Metacharacters)
| 元字符 | 描述 |
|---|---|
. |
匹配任何单个字符(通常不包括换行符) |
[ ] |
字符类,匹配括号内任意单个字符,如 [abc] 可匹配 "a", "b", "c" |
[^ ] |
反向字符类,匹配不在括号内的字符,如 [^abc] 可匹配除 "a", "b", "c" 以外的字符 |
^ |
匹配字符串起始位置 |
$ |
匹配字符串结尾位置 |
|
定义子表达式(捕获组),匹配的内容可在 \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:]] |
匹配 除 小写字母、A、B、Z 以外的字符 |
适用工具
支持 POSIX 扩展正则表达式(ERE)的工具:
- AWK(默认使用 ERE)
- Grep(使用
-E启用 ERE) - Sed(使用
-E启用 ERE)
总结
- ERE 语法比 BRE 更简洁,去除了许多反斜杠
\的使用,例如:\(ab\)在 ERE 中写作(ab)a\{3,5\}在 ERE 中写作a{3,5}
- ERE 默认支持
+、?、|,这些在 BRE 中需要加\ - ERE 广泛应用于
awk、grep -E、sed -E,简化了复杂模式匹配 - ERE 仍然保持 POSIX 的标准字符类
[:digit:]、[:alpha:]等
总结来说,POSIX 扩展正则表达式(ERE)是 BRE 的进化版本,使用更简洁的语法,使模式匹配更直观和高效。
最后修改: 2025年01月30日 星期四 02:17