认识正则表达式

正则表达式起源于科学家对人类神经系统工作原理的早期研究。美国新泽西州的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对正则表达式的支持则比较“朴素”。

PHP中的正则函数

正则表达式看起来总是那么古怪,以至于许多人对其望而生畏。首先要澄清一些概念:虽然不同语言间正则语法大同小异,但实际上正则表达式的实现有多种引擎(如非确定性有穷自动机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中合法的正则表达式在此工具里也不一定能测试通过。其中的道理前面已经讲过了,不同语言实现的正则表达式略有区别。

此工具可以在火狐中添加附件,然后搜索下载

示例

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值