正则表达式(Regular Expressions)
Completion requirements
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 的进化版本,使用更简洁的语法,使模式匹配更直观和高效。
Last modified: Thursday, 30 January 2025, 2:17 AM