参考资料
- 07丨正则有哪些常见的流派及其特性?👍👍👍
- Linux/Unix工具与正则表达式的POSIX规范
目录
- 一. 正则表达式简史
- 二. POSIX 流派
- 2.1 POSIX 字符组
- 2.2 BRE 标准
- 2.3 ERE 标准
- 三. PCRE 流派
- 四. 总结
一. 正则表达式简史
- 1986年,
POSIX标准
诞生,定义了 Unix 操作系统应当支持的功能,其中也包括正则表达式的规范。- Unix 系统或类 Unix 系统上的大部分工具,如
grep
、sed
、awk
等,均遵循该标准。
- Unix 系统或类 Unix 系统上的大部分工具,如
- 1987年,
Perl
编程语言诞生,该语言的正则表达式走红。 - 1997年,
PCRE--Perl
兼容正则表达式(Perl Compatible Regular Expressions)诞生PCRE
是一个兼容Perl
语言正则表达式的解析引擎PCRE
现已成为其他大部分语言和工具隐然遵循的标准。
二. POSIX 流派
类型 | 全称 | 中文 | 常见命令中默认使用 |
---|---|---|---|
BRE | Basic Regular Expression | 基本正则表达式 | grep 、sed |
ERE | Extended Regular Expression | 扩展正则表达式 | egrep 、awk 、grep -E |
2.1 POSIX 字符组
POSIX字符组 | 解释 | 等价表示 |
---|---|---|
[[:alnum:]] | 数字和字母 | [0-9A-Za-z] → 比\w 少了下划线 |
[[:alpha:]] | 字母 | [A-Za-z] |
[[:ascii:]] | ASCII | [\x00-\x7F] |
[[:blank:]] | 空格和制表符 | [\t] |
[[:cntrl:]] | 控制字符 | [\x00-\x1F\x7F] |
[[:digit:]] | 数字 | [0-9] |
[[:graph:]] | 可见字符 | [!-~] 或查看①可见字符详情 |
[[:lower:]] | 小写字母 | [a-z] |
[[:upper:]] | 大写字母 | [A-Z] |
[[:print:]] | 可打印字符 | [-~] 或 [[:graph:]] 加空格 |
[[:punct:]] | 标点符号 | 查看②标点符号详情 |
[[:space:]] | 空白字符 | [\t\n\v\f\r] |
[[:xdigit:]] | 16进制数字 | [0-9A-Fa-f] |
⏹①可见字符详情
[A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
⏹②标点符号详情
[!-\/:-@[-`{-~]
2.2 BRE 标准
⏹BRE
标准(Basic Regular Expression
基本正则表达式),元字符需要转义。
元字符 | 含义 | 示例 | 说明 |
---|---|---|---|
. | 匹配任意一个字符 | a.c | 匹配 abc , a1c 等 |
* | 匹配前一个字符 0 次或多次 | bo* | 匹配 b , bo , booo |
\? | 匹配前一个字符 0 或 1 次 | e\? | 匹配 e 或省略 |
\+ | 匹配前一个字符 1 次或多次 | a\+ | 匹配 a , aa 等 |
\| | 或运算 | foo\|bar | 匹配 foo 或 bar |
\(\) | 分组 | \(ab\)\+ | 匹配一个或多个 ab |
\{n,m\} | 匹配前一个字符 n 到 m 次 | a\{2,4\} | 匹配 aa , aaa , aaaa |
2.3 ERE 标准
⏹ERE
标准(Extended Regular Expression
扩展正则表达式),无需转义大多数元字符,语法更简洁、可读性更好。
元字符 | 含义 | 示例 | 说明 |
---|---|---|---|
. | 匹配任意一个字符 | a.c | 同 BRE |
* | 匹配前一个字符 0 次或多次 | bo* | 同 BRE |
? | 匹配前一个字符 0 或 1 次 | e? | 等价于 BRE 中的 \? |
+ | 匹配前一个字符 1 次或多次 | a+ | 等价于 BRE 中的 \+ |
| | 或运算 | `foo | bar` |
() | 分组 | (ab)+ | 等价于 BRE 中的 \(ab\)\+ |
{n,m} | 匹配前一个字符 n 到 m 次 | a{2,4} | 同 BRE |
三. PCRE 流派
⏹1987年,Perl
编程语言诞生,该语言的正则表达式走红。
- 随着 Perl 语言的发展,Perl 语言中的正则表达式功能越来越强悍,为了把 Perl 语言中正则的功能移植到其他语言中,
PCRE
就诞生了。PCRE
提供了比POSIX
(BRE 和 ERE)更强大的功能。 - 目前大部分常用
编程语言
都是源于 PCRE 标准,这个流派显著特征是有\d
、\w
、\s
这类字符组简记方式。 - 目前广泛应用于
PHP
、Python
、JavaScript
、grep -P
、C 语言库
、正则调试工具
等场景。
🔹 PCRE 与 POSIX 的区别
规则 | PCRE | ERE(扩展正则) | BRE(基本正则) |
---|---|---|---|
\d | ✅ | ❌ | ❌ |
\w | ✅ | ❌ | ❌ |
\s | ✅ | ❌ | ❌ |
+ | ✅ | ✅ | 需要 \+ 转义 |
{n,m} | ✅ | ✅ | 需要 \{n,m\} 转义 |
| | ✅ | ✅ | 需要 \| 转义 |
() | ✅ | ✅ | 需要 \(\) 转义 |
(?=...) | ✅ | ❌ | ❌ |
(?!...) | ✅ | ❌ | ❌ |
(?<=...) | ✅ | ❌ | ❌ |
(?<!...) | ✅ | ❌ | ❌ |