正则表达式起源于科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出一种用数学方式来描述神经网络的新方法,他们创新地将神经系统中的神经元描述成小而简单的自动控制元,从而做出一项伟大的工作革新。后来,数学科学家Stephen Kleene在Warren McCulloch和Walter Pitts早期工作的基础之上发表一篇论文,题目是《神经网事件的表示法》,书中利用正则集合的数学符号描述此模型,引入正则表达式的概念。
正则表达式就是用某种模式去匹配一类字符串的一种公式。通俗地讲,就是用正则表达式就是用某种模式去匹配一类字符串的一种公式。通俗地讲,就是用一个“字符串”描述一个特征,然后验证另一个“字符串”是否符合这个特征的公式。
比如“ab+”描述的特征是:一个a和任意个b。那么ab、abb、abbbbbbbbbb都符合这个特征,而字符串ad显然是不符合的。
正则表达式可应用到各个方面。在常用的高级编辑器中,几乎都支持正则表达式,如Word、EditPlus、UltraEdit、Vim等。
正则表达式在编程语言中更是得到大规模推广。现在的语言几乎都是原生的,都可从语法上支持正则表达式,尤其在Perl的推动下,PHP、Java、.NET、JavaScript等语言都支持丰富的正则语法;不支持的可以通过一些包实现扩展。每种语言中对正则表达式的支持有所不同,其中Perl和.NET对正则表达式的支持最为强大,而JavaScript对正则表达式的支持则比较“朴素”。
正则表达式看起来总是那么古怪,以至于许多人对其望而生畏。首先要澄清一些概念:虽然不同语言间正则语法大同小异,但实际上正则表达式的实现有多种引擎(如非确定性有穷自动机NFA、确定性有穷自动机DFA),其表现又有多种风格(如JavaScript有自己的朴素正则、Perl有一套高级而强大的正则、.NET也有自己的一套正则风格)。另外,还有人可能容易混淆PHP中的preg和ereg。
简单地说,PHP中有两套正则函数,两者功能差不多:
1)由PCRE库提供的函数,以“preg_”为前缀命名。
PCRE(Perl Compatible Regular Expression,兼容Perl的正则表达式)由Philip Hazel于1997年开发。现代的编程语言和软件中一般都使用PCRE库。
2)由POSIX扩展提供的函数,以“ereg_”为前缀命名。
POSIX(Portable Operating System Interface of UNIX, UNIX可移植操作系统接口)由一系列规范构成,定义了UNIX操作系统应支持的功能,所以“POSIX风格的正则表达式”也就是“关于正则表达式的POSIX规范”,定义了BRE(Basic Regular Expression,基本型正则表达式)和ERE(Extended Regular Express,扩展型正则表达式)两大流派。通常UNIX的一些工具和较老的软件中会使用POSIX风格的正则。另外,一些数据库中也提供了POSIX风格的正则表达式。
自PHP 5.3以后,就不再推荐使用POSIX正则函数库,若程序中使用了则会报Deprecated级别的错误,这种情况通常在一些较老的代码中比较常见。其实使用或不使用POSIX正则函数库二者本质上没多大差别,主要是一些表现形式、语法和扩展功能的差别。
在Windows资源管理器中查找文件以及批处理文件时,可使用通配符“?”和“”表示匹配一组字符,这和正则表达式类似,“?”表示一个不确定的字符,而“”则表示任意多个不确定字符。比如下面是删除本地垃圾文件批处理的部分代码:
需要【注意】的是,这里的“?”和“*”称为“通配符”,而不是正则表达式。
在PHP里,一个正则表达式分为三个部分:分隔符、表达式和修饰符。
分隔符:可以是除了字母、数字、反斜线及空白字符以外的任何字符(比如/、!、#、%、|、~等)。经常使用的分隔符是正斜线(/)、hash符号(#)以及取反符号(~)。考虑到可读性,为了避免和反斜线混淆,一般不使用正斜线做分隔符。
表达式:由一些特殊字符和非特殊的字符串组成,比如“[a-z0-9_ –]+@[a-z0-9_ .]+”可以匹配一个简单的电子邮件字符串。
修饰符:用于开启或者关闭某种功能/模式。
在学习过程中,建议下载RegexTester工具验证和测试正则表达式,也可使用Firefox的扩展Regular Expression Tester进行测试,其界面如图:
【注意】 这个工具测试的代码不一定能在PHP中通过,反之PHP中合法的正则表达式在此工具里也不一定能测试通过。其中的道理前面已经讲过了,不同语言实现的正则表达式略有区别。
此工具可以在火狐中添加附件,然后搜索下载