今天有个同事问起,php中的正则语法为什么和perl中的正则语法如此的类似,是谁兼容谁?到底正则是什么?所以有了这篇文章
在我们的日常工作中,无论是在php中用正则匹配字符串,还是nginx用正则重写url,还是在vi中查找字符,总是,用处很多也很方便。
那到底什么是正则表达式?为什么各个应用中正则的语法大都相同?下面我们来说一下这几个问题
历史由来:最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。1940年,Warren McCulloch与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。自此,正则表达式被广泛地使用于各种Unix或者类似Unix的工具,例如Perl。Perl的正则表达式源自于Henry Spencer写的regex,它已经演化成了pcre(Perl兼容正则表达式,Perl Compatible Regular Expressions),一个由Philip Hazel开发的,为很多现代工具所使用的库。
大家都明白了吧,我们在ed、grep、perl中使用的正则都是在这几个程序中独立实现的,而在我们的nginx、php、mysql等各种语言系统或应用中都是引用pcre库函数,同时pcre的库函数也支持posix协议,方便外部应用的统一调用,这也是我们为什么安装这些软件的时候机器上要安装pcre软件包。
总而言之,正则表达式是用一定语法的字符串来匹配符合规则的字符串的一种思维方式,无论采用哪种实现的引擎,内部采用何种算法,都是为了更方便更快速的查找到我们需要的东西,至于是独立实现还是引用写好的库函数更不是那么的重要了。至于语法的大同小异,也是由于各种应用下不同的情况下具体定制的,知道就可以了。