前言
正则表达式在我们日常的软件开发过程中被广泛使用,例如编写Nginx配置文件、在 Linux与macOS下查找文件,然而不同软件不同操作系统对于正则的应用有着不一样的行为,主要原因是正则表达式演进过程中,出现POSIX与PCRE派系之分。
一、历史
先了解一下正则表达式的演进史
20世纪40年代,两位神经生理学家Warren McCulloch 和Walter Pitts,研究出了一种用数学方式来描述神经网络的方法,可以将神经系统中的神经元描述成小而简单的自动控制元。
50年代,一位叫Stephen Kleene的数学家在McCulloch和Pitts早期工作的基础上,发表了《神经网络事件表示法和有穷自动机》 论文。这篇论文描述了一种叫做 "正则集合(Regular Sets)" 的数学符号,引入了正则表达式的概念。
60年代,Unix之父Ken Thompson发表了《正则表达式搜索算法》论文。并且根据这篇论文的算法,将正则引入到编辑器qed,以及之后的编辑器ed中,然后又移植到了我们熟悉的文本搜索工具grep中。
70年代,由于grep支持的功能不多,因此Alfred Aho编写了egrep程序(其中e表示加强版的意思)。在grep 、egrep 发展的同时,awk 、lex 、sed等异军也开始凸起,每个程序所支持的正则表达式都有差别。
80年代,POSIX (Portable Operating System Interface) 标准公诸于世,它制定了不同的操作系统都需要遵守的一套规则,其中就包括正则表达式的规则。遵循POSIX规则的正则表达式,称为POSIX派系的正则表达式。Unix 系统或类Unix系统上的大部分工具,如grep 、sed 、awk等都属于POSIX派系。
同样在80年代,Larry Wall发布了Perl编程语言,其中引入的正则表达式功能是颗耀眼明珠。
90年代,随着Perl语言的发展,它的正则表达式功能越来越强悍。为了把Perl语言中正则的功能移植到其他语言中,PCRE(Perl Compatible Regular Expressions)派系的正则表达式也诞生了。现代编程语言如Python ,Ruby ,PHP ,C / C++ ,Java 等正则表达式,大部分都属于PCRE派系。
总的来说,经历20世纪80至90年代洗礼,正则表达式形成了两大派系:POSIX 与 PCRE。

二、POSIX与PCRE
POSIX派系
BRE和ERE标准
BRE标准(Basic Regular Expression基本正则表达式) ERE标准(Extended Regular Expression扩展正则表达式)

POSIX字符组

PCRE派系
PCRE与Perl
Perl1提供了正则表达式操作符——是通用脚本语言的首创
Perl2补充/i量词,能够进行不区分大小写匹配等
Perl3支持/e量词,能够增强替换运算符的能力;{min,max}区间量词等
Perl5 添加 非捕获的括号,忽略优先的量词,顺序环视功能等
特性
更易用 相对于POSIX派系的BRE标准,不需要使用\进行转义 例如:在多选分支结构直接使用|即可(1|2表达1或者2)
更简洁 在兼容POSIX字符组的基础上还支持更简洁的写法: 例如:\w等价于[[:word:]],\d等价于[[:digit:]]
更多功能 例如:Look-around(环顾断言),Non-capturing Group(非捕获组),non-greedy(非贪婪)等。
总结

三、实战
12345
abcde
不带参数,为POSIX BRE模式
带参数-E,为POSIX ERE模式,
带参数-P,为PCRE模式(macOS不支持)
实验结果如下图:

实验结论
在Linux环境下

在macOS环境下
总结
确认版本类型(GNU ,BSD)。建议统一使用GNU中grep程序,避免在不同环境下运行结果不符合预期的现状。 确认每个模式下的选项(BRE,ERE,PCRE)。尽可能选择PCRE模式,因为PCRE 模式更符合我们的使用习惯。
附录
POSIX字符组详细内容

PCRE、GNU BRE、GNU ERE 对比


GNU

BSD
FreeBSD、OpenBSD、NetBSD
DragonFly BSD
其他发行版
参考资料
《精通正则表达式》第3版
07 | 正则有哪些常见的流派及其特性?
正则表达式“派别”简述 - Keep Coding
正则表达式的历史与几大流派 - 小蒋不素小蒋 - 博客园
Regex cheatsheet
GNU是什么,和Linux是什么关系?- 知乎
Difference Between Linux And BSD | Open Source Operating Systems
Unix,BSD,GNU 和Linux之间是什么关系?- 掘金
PCRE、GNU BRE、GNU ERE对比


快乐工作,快乐生活
Happy work , Happy life






