(基础篇) 正则表达式详解

一 什么是正则表达式:

简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。

在某个Linux网站上面有这样的话:"如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。"

正如上面说的,正则表达式看起来非常复杂,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……

二 正则表达式的基本语法:

一个正则表达式,分为三个部分:分隔符,表达式和修饰符。

分隔符可以是除了特殊字符以外的任何字符(比如"/ !"等等),常用的分隔符是"/"。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如"[a-z0-9_-][email protected][a-z0-9_-.]+"可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子:

/hello.+?hello/is

上面的正则表达式"/"就是分隔符,两个"/"之间的就是表达式,第二个"/"后面的字符串"is"就是修饰符。

在表达式中如果含有分隔符,那么就需要使用转义符号"/",比如"/hello.+?//hello/is"。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要"/"来转义,比如"/d"代表全体数字。

三 正则表达式的特殊字符:

正则表达式中的特殊字符分为元字符、定位字符等等。

元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。

元字符:

大括号:大括号用来精确指定匹配元字符出现的次数,例如"/pre{1,5}/"表示匹配的对象可以是"pre"、"pree"、"preeeee"这样在"pr"后面出现1个到5个"e"的字符串。或者"/pre{,5}/"代表pre出现0此到5次之间。

加号:"+"字符用来匹配元字符前的字符出现一次或者多次。例如"/ac+/"表示被匹配的对象可以是"act"、"account"、"acccc"等在"a"后面出现一个或者多个"c"的字符串。"+"相当于"{1,}"。

星号:"*"字符用来匹配元字符前的字符出现零次或者多次。例如"/ac*/"表示被匹配的对象可以是"app"、"acp"、"accp"等在"a"后面出现零个或者多个"c"的字符串。"*"相当于"{0,}"。

问号:"?"字符用来匹配元字符前的字符出现零次或者1次。例如"/ac?/"表示匹配的对象可以是"a"、"acp"、"acwp"这样在"a"后面出现零个或者1个"c"的字符串。"?"在正则表达式中还有一个非常重要的作用,即"贪婪模式"。

还有两个很重要的特殊字符就是"[ ]"。他们可以匹配"[]"之中出现过的字符,比如"/[az]/"可以匹配单个字符"a"或者"z";如果把上面的表达式改成这样"/[a-z]/",就可以匹配任何单个小写字母,比如"a"、"b"等等。

如果在"[]"中出现了"^",代表本表达式不匹配"[]"内出现的字符,比如"/[^a-z]/"不匹配任何小写字母!并且正则表达式给出了几种"[]"的默认值:

[:alpha:]:匹配任何字母

[:alnum:]:匹配任何字母和数字

[:digit:]:匹配任何数字

[:space:]:匹配空格符

[:upper:]:匹配任何大写字母

[:lower:]:匹配任何小写字母

[:punct:]:匹配任何标点符号

[digit:]:匹配任何16进制数字

另外下面这些特殊字符在转义符号"/"转义后代表的含义如下:

s:匹配单个的空格符

S:用于匹配除单个空格符之外的所有字符。

d:用于匹配从0到9的数字,相当于"/[0-9]/"。

w:用于匹配字母,数字或下划线字符,相当于"/[a-zA-Z0-9_]/"。

W:用于匹配所有与w不匹配的字符,相当于"/[^a-zA-Z0-9_]/"。

D:用于匹配任何非10进制的数字字符。

.:用于匹配除换行符之外的所有字符,如果经过修饰符"s"的修饰,"."可以代表任意字符。

利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如"//d0000/"利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。

定位字符:

定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。

^:表示匹配的模式出现在匹配对象的开头(和在"[]"里面不同)

$:表示匹配的模式出现在匹配对象的末尾

空格:表示匹配的模式出现在开始和结尾的两个边界之一

"/^he/":可以匹配以"he"字符开头的字符串,比如hello、height等等;

"/he$/":可以匹配以"he"字符结尾的字符串即she等;

"/ he/":空格开头,和^的作用一样,匹配以he开头的字符串;

"/he /":空格结束,和$的作用一样,匹配以he结尾的字符串;

"/^he$/":表示只和字符串"he"匹配。

括号:

正则表达式除了可以用户匹配,还可以用括号"()"来记录需要的信息,储存起来,给后面的表达式读取。比如:

/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/

就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为[email protected]之类的),在后面如果想要读取记录下来的字符串,只是需要用"转义符+记录的次序"来读取。比如"/1"就相当于第一个"[a-zA-Z0-9_-]+","/2"相当于第二个([a-zA-Z0-9_-]+),"/3"就是第三个(.[a-zA-Z0-9_-])。但是在PHP中,"/"是一个特殊的字符,需要转义,所以""到了PHP的表达式中就应该写成"//1"。

其他特殊符号:

"|":或符号"|"和PHP里面的或一样,不过是一个"|",而不是PHP的两个"||"!意思就是可以是某个字符或者另一个字符串,比如"/abcd|dcba/"可能匹配"abcd"或者"dcba"。

四 贪婪模式:

前面在元字符中提到过"?"还有一个重要的作用,即"贪婪模式",什么是"贪婪模式"呢?

比如我们要匹配以字母"a"开头字母"b"结尾的字符串,但是需要匹配的字符串在"a"后面含有很多个"b",比如"a bbbbbbbbbbbbbbbbb",那正则表达式是会匹配第一个"b"还是最后一个"b"呢?如果你使用了贪婪模式,那么会匹配到最后一个"b",反之只是匹配到第一个"b"。

使用贪婪模式的表达式如下:

/a.+?b/

/a.+b/U

不使用贪婪模式的如下:

/a.+b/

上面使用了一个修饰符U,详见下面的部分。

五 修饰符:

在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着"e"并不等于"E")。正则表达式里面的修饰符如下:

i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。

m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。

s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!

x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。

e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。

A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。

E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。

U:和问号的作用差不多,用于设置"贪婪模式"。

六 PCRE相关的正则表达式函数:

PHP的Perl兼容正则表达式提供的多个函数,分为模式匹配,替换和匹配数目等等:

1、preg_match :

函数格式:int preg_match(string pattern, string subject, array [matches]);

这个函数会在string中使用pattern表达式来匹配,如果给定了[regs],就会将string记录到[regs][0]中,[regs][1]代表使用括号"()"记录下来的第一个字符串,[regs][2]代表记录下来的第二个字符串,以此类推。preg如果在string中找到了匹配的pattern,就会返回"true",否则返回"false"。

2、preg_replace :

函数格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);

这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符,则可以使用"()"来记录,在replacement中只是需要用"/1"来读取。

3、preg_split :

函数格式:array preg_split(string pattern, string subject, int [limit]);

这个函数和函数split一样,区别仅在与split可以使用简单正则表达式来分割匹配的字符串,而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。

4、preg_grep :

函数格式:array preg_grep(string patern , array input);

这个函数和preg_match功能基本上,不过preg_grep可以将给定的数组input中的所有元素匹配,返回一个新的数组。

下面举一个例子,比如我们要检查Email地址的格式是否正确:

代码如下:

<?php

function emailIsRight($email) {

if (preg_match("^[_/.0-9a-z-][email protected]([0-9a-z][0-9a-z-]+/.)+[a-z]{2,3}$",$email)) {

return 1;

}

return 0;

}

if(emailIsRight(‘[email protected]‘)) echo ‘正确<br>‘;

if(!emailIsRight(‘[email protected]‘)) echo ‘不正确<br>‘;

?>  

上面的程序会输出"正确<br>不正确"。

七.PHP中的Perl兼容正则表达式和Perl/Ereg正则表达式的区别:

虽然叫做“Perl兼容正则表达式”,但是和Perl的正则表达式相比,PHP的还是由一些不同,比如修饰符“G”在Perl里面代表全部匹配,但是在PHP中没有加入对这个修饰符的支持。

还有就是和ereg系列函数的区别,ereg也是PHP中提供的正则表达式函数,不过和preg相比,要弱上很多。

1、ereg里面是不需要也不能使用分隔符和修饰符的,所以ereg的功能比preg要弱上不少。

2、关于".":点在正则里面一般是除了换行符以外的全部字符,但是在ereg里面的"."是任意字符,即包括换行符!如果在preg里面希望"."能够包括换行符,可以在修饰符中加上"s"。

3、ereg默认使用贪婪模式,并且不能修改,这个给很多替换和匹配带来麻烦。

4、速度:这个或许是很多人关心的问题,会不会preg功能强大是以速度来换取的?不用担心,preg的速度要远远比ereg快,笔者做了一个程序测试:

time test:

代码如下:

<?php

echo "reg_replace used time:";

$start = time();

for($i=1;$i<=100000;$i++) {

$str = "ssssssssssssssssssssssssssss";

preg_replace("/s/","",$str);

}

$ended = time()-$start;

echo $ended;

echo "

ereg_replace used time:";

$start = time();

for($i=1;$i<=100000;$i++) {

$str = "ssssssssssssssssssssssssssss";

ereg_replace("s","",$str);

}

$ended = time()-$start;

echo $ended;

echo "

str_replace used time:";

$start = time();

for($i=1;$i<=100000;$i++) {

$str = "sssssssssssssssssssssssssssss";

str_replace("s","",$str);

}

$ended = time()-$start;

echo $ended;

?>

结果:

Preg_replace used time:5

ereg_replace used time:15

str_replace used time:2

 

str_replace因为不需要匹配所以速度非常快,而preg_replace的速度比ereg_replace要快上不少。

时间: 2024-08-05 07:04:05

(基础篇) 正则表达式详解的相关文章

java基础篇---枚举详解

在JDK1.5之前,JAVA可以有两种方式定义新类型:类和接口,对于大部分面向对象编程,有这两种似乎就足够了,但是在一些特殊情况就不合适.例如:想要定义一个Color类,它只能有Red,Green,Blue三种,其他值则是错误,在JDK1.5之后便引入枚举类型. 枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值. public enum Color{ RED,GREEN,BLUE ; // 定义三个枚举的类型 }; 枚举中有三个取值

grep正则表达式详解及练习

grep正则表达式详解及练习 一.在学习grep正则表达式前,先了解下linux著名的文本处理三剑客: (1)grep.egrep.fgrep 文本搜索工具. (2)sed     文本编辑工具,一种流编辑器,行编辑工具. (3)awk 强大的文本分析工具,文本格式化工具,文本报告生成器. 以上三大命令均支持正则表达式,本文以grep正则表达式为例展开学习. 1.什么是正则表达式? 正则表达式(Regular Expression):由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意

Java 正则表达式详解_正则表达式

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}

基础拾遗------redis详解

基础拾遗 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗------接口详解 基础拾遗------泛型详解 前言 这篇文章和以往的基础拾遗有所不同,以前的介绍的都是c#基础,今天介绍的是redis.因为项目中一只在使用,我想现在大部分项目中都会用到nosql,缓存,今天就介绍一下redis..废话少说下面开始正题. 1.redis是什么? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 对的redi

Mysql高手系列 - 第14篇:详解事务

这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操作指令详解 事务的隔离级别详解 脏读.不可重复读.可重复读.幻读详解 演示各种隔离级别产生的现象 关于隔离级别的选择 什么是事务? 数据库中的事务是指对数据库执行一批操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况. 举个例子 比如A用户给B用户转账100操作,过程如下: 1

python正则表达式详解

python正则表达式详解 正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的.下面,我来介绍一下python中的正则表达式是怎么使用的. 首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

PHP正则表达式详解(一)

前言: 半年前我对正则表达式产生了兴趣,在网上查找过不少资料,看过不少的教程,最后在使用一个正则表达式工具RegexBuddy时,发现他的教程写的非常好,可以说是我目前见过最好的正则表达式教程.于是一直想把他翻译过来. 本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版权归原作者所有,欢迎转载.但是为了尊重原作者和译者的劳动,请注明出处!谢谢! 1.什么是正则表达式 基本说来,正则表达式是一种用来描述一定数量文本的模式.Regex代表Regular Express.本文将用

(赵小明RHCE笔记)linux基础之四 权限详解

一.special permissions for executables1.special permissions for executables:  -suid:command run with permissions of the owner of the command,not executor of   the command  -sgid:command runs with group affiliation of the group of the commandeg:file:us

Shell编程之---正则表达式详解

正则表达式详解 普通字符:只是字面的意思 元字符:超过字面意思的意义 基本正则表达式元字符及其意义 * #0个或多个在*字符之前的那个普通字符 .               #匹配任意字符 ^         #匹配行首 $         #匹配行尾 $$ #执行上一条命令 !$ #上一条命令的最后一个参数,例如是/etc/passwd,继续对该参数操作,可以为 cat !$ []        #匹配字符集合 \          #转义符 \{n\}      #匹配前面字符出现n次 \