第5章 正则表达式_第1页
第5章 正则表达式_第2页
第5章 正则表达式_第3页
第5章 正则表达式_第4页
第5章 正则表达式_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 主要内容: 基本概念 正则表达式语法规则 PCRE规格函数库 POSIX扩展正则表达式函数 正则表达式的定义 正则表达式(regular expression)描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配、查找、匹配、查找、替换和分割替换和分割等操作。 正则表达式是极其简洁的,但是它有自己的语法和规则,其功能非常灵活和强大。 两种规格的正则表达式: PCRE(Perl兼容扩展正则表达式) Perl Compatible Regular Expression 使用”preg_”为前缀命名的函数, 表达式都应包含在定界符中,如斜线(/ /) POSIX Portable

2、 Operating System Implementation for Unix,意为UNIX可移植操作系统实现接口 使用以”ereg_”为前缀命名函数 两套函数库功能相似,实现相同的功能,PCRE提供的正则表达式效率略占优势/-?d+$|-?0 xXda-fA-F+$/0-9a-zA-Z_-+0-9a-zA-Z_-+(.0-9a-zA-Z_-+)0,3$/ 正则表达式是由原子(普通字符,例如AZ,az)、有特殊功能的字符(元字符,例如*、+、?等)及模式修正符组成的文字模式。 一个最简单的正则表达式模式中,至少要包含一个原子,如“/a/” 反斜线 /; 其他可作为定界符的字符,如 #,!,

3、| 等 一般,字母、数字、不作为定界符 如: / |(d3-d+)| !s+(s+)?$! /href=(.*) /非法,无结束定界符 原子是正则表达式最基本组成单位 每个模式中至少包含一个原子 原子字符包括所有的英文字母、数字、标点符号以及其他一些符号。原子也包括以下内容。 单个字符、数字,如az,AZ,09。 模式单元,如(ABC)可以理解为由多个原子组成的大的原子。 原子表,如 ABC。 普通转义字符,如:d, D, w,W,S,s 重新使用的模式单元,如:1 转义元字符,如:*,.原子说明-d匹配一个数字;等价于0-9D匹配除数字以外任何一个字符;等价于0-9w匹配一个英文字母、数字或

4、下划线;等价于0-9a-zA-Z_W匹配除英文字母、数字和下划线以外任何一个字符;等价于0-9a-zA-Z_s匹配一个空白字符;等价于fnrtvS匹配除空白字符以外任何一个字符;等价于fnrtvf匹配一个换页符等价于 x0c 或 cLn匹配一个换行符;等价于 x0a 或 cJr匹配一个回车符等价于x0d 或 cMt匹配一个制表符;等价于 x09或clv匹配一个垂直制表符;等价于x0b或ck 匹配相应类型中的一个字符 共6种:d,D,s,S,w,W 如: /w+w+(.w+)0,3$/ Email正则表达式模式原子表原子表”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个 ”

5、a” 或 ”e” 使用 ae。 例如: Praey 匹配 ”Pray” 或者 ”Prey ”。原子表原子表 ” 或者称为排除原子表,匹配除表内原子外的任意一个字符。 例如:/pu/匹配“part”中的“pa”,但无法匹配“computer”中的“pu”因为“u”在匹配中被排除。原子表原子表“-”用于连接一组按ASCII码顺序排列的原子,简化书写。 例如:/x0123456789/可以写成x0-9,用来匹配一个由 “x” 字母与一个数字组成的字符串。例如: /a-zA-Z/匹配所有大小写字母 /a-z0-9$/匹配比如“z2”、 “t6” 、“g7” /0 xX0-9a-fA-F/匹配一个简单的

6、十六进制数字,如“0 x9”。 /0-9a-zA-Z_/匹配除英文字母、数字和下划线以外任何一个字符,其等价于W。 /0? xX0-9a-fA-F+/匹配十六进制数字,可以匹配“0 x9B3C”或者“X800”等。 /可以匹配“”、“”或“”等HTML标签,并且不严格的控制大小写。元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”进行转义 元字符元字符说明说明*0次、1次或多次匹配其前的原子+1次或多次匹配其前的原子?0次或1次匹配其前的原子|匹配两个或多个选择 或 A 匹配字符串串首的原子$ 或 Z 匹配字符串串尾的原子b匹配单词的边界B匹配

7、除单词边界以外的部分匹配方括号中的任一原子匹配除方括号中的原子外的任何字符m表示其前原子恰好出现m次m,n表示其前原子至少出现m次,最多出现n次(nm)m,表示其前原子出现不少于m次()整体表示一个原子.匹配除换行之外的任何一个字符 1、定位符:和$ 作用:描述字符串或单词的边界; 例如,在字符串“Tom and Jerry chased each other in the house until toms uncel come in”中 元字符元字符“”或或“A” 置于字符串的开始确保模式匹配出现在字符串首端;/Tom/ 元字符元字符“$”或或“Z” 置于字符串的结束,确保模式匹配出现字符串

8、尾端。/in$/ 如果不加边界限制元字符,将获得更多的匹配结果。/Tom$/精确匹配/Tom/模糊匹配 在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。 例如:在字符串“This island is a beautiful land”中 元字符元字符“b”对单词的边界进行匹配;/bisb/匹配单词“is”,不匹配“This”和“island”。/bis/匹配单词“is”和“island”中的“is”,不匹配“This” 元字符元字符“B”对除单词边界以外的部分进行匹配。/BisB/将明确的指示不与单词的左、右边界匹配,只匹配单词 的内部

9、。所以在这个例子中没有结果。/Bis/匹配单词“This”中的“is” 正则表达式中有一些用于重复匹配某些原子的元字符: *、+、?、n、n,、n,m, 他们主要的区别是重复匹配的次数不同。 元字符元字符“?”:表示0次或1次匹配紧接在其前的原子。例如:/colou?r/匹配“colour”或“color”。 元字符元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。例如:/zo*/可以匹配z、zoo 元字符元字符“+”:表示1次或多次匹配紧接在其前的原子。例如:/go+gle/匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。 元字符元字符“”准确地指定原

10、子重复的次数 “m”表示其前原子恰好出现m次; “m,n”表示其前原子至少出现m次,至多出现n次; “m,”表示其前原子出现不少于m次。 例如: /zo1,3m/只能匹配字符串“zom”、“zoom”、或“zooom”。 /zo3m/只能匹配字符串“zooom” /zo3,m/可以匹配以 “z” 开头,“m”结束,中间至少为3个“o”的字符串。 /bo0,1u/可以匹配字符串“bought a butter” 中的“bou”和“bu”,等价于bo?u。 元字符元字符“.”匹配除换行符外任何一个字符,相当于n(Unix系统)或rn(windows系统)。 例如:/pr.y/可以匹配的字符串“pr

11、ey”、“pray”或“pr%y”等。 通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。 例如: /a.*z$/表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。 /.+/也可以完成类似的匹配功能所不同的是其至少匹配一个字符。 /a.+z$/匹配“az”不匹配字符串“az”。 元字符元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。 例如:在字符串“There are many apples and pears.”中,/apple|pear/在第一次运行时匹配“apple”;再次运行时匹配“ pea

12、r”。也可以继续增加选项,如:/apple|pear|banana|lemon/ 系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“1”、“2”、“3”的形式进行引用。当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“1”、“2”例如: /d2(W)d21d4$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式。这是因为模式“W”的结果“/”已经被存储。下个位置“1”引用时,其匹配模式也是字符“/”。 当不需要存储匹配结果时使用非存储模式单元“(?:)

13、” 例如/(?:a|b|c)(D|E|F)1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成/(a|b|c)(D|E|F)2g/。在PCRE表达式中的最后一个分隔符/后,可以添加模式修正符,扩展了正则表达式在字符匹配、替换操作时的某些功能,修正增强了正则表达式的处理能力。模式修正符一般标记于整个模式之外,并且可以组合使用,如“/apple/i”、“/cat|dog/uis”等。模式修正符说明i可同时匹配大小写字母m将字符串视为多行s将字符串视为单行,换行符做普通字符看 待,使“.”匹配任何字符x模式中的空白忽略不计S - 当

14、一个模式将被使用若干次时,先对其进行 分析U匹配到最近的字符串e将替换的字符串作为表达使用 元字符元字符“()()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。 例如: /(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”,因为紧接着“+”前的原子是元字符“()”括起来的字符串“Dog”。 /You (very )+ old/匹配“You very old”、“You very very old” /Hello (world|earth)/匹配“Hello world”、“Hello earth” 一个模式单

15、元中的表达式将被优先匹配或运算。 下面是几个简单的示例,可以说明模式修正符的使用 /apple/i匹配“apple”或“Apple”等,忽略大小写。 /I love you/ix匹配“iloveYou”,忽略大小写以及空白。 / U将依次匹配字符串“Cool music Few years ago. ”中的“”、“”和“”。而/却匹配到最后一个可用的字符串,既“Coolmusic” 。 /Uis将HTML文件视为单行字符串,忽略大小写和换行符。匹配其中的所有以“h”开头的标签,如“”、“”等。 在使用正则表达式时,需要注意匹配的顺序。通常,正则表达式按照由左至右的顺序依次匹配。 模式匹配的顺序

16、(从高到低)顺序元字符说明 1() 模式单元 2?* + 重复匹配 3 $ 边界限制 4 | 模式选择兼容的正则表达式函数:兼容的正则表达式函数: preg_match_all - 进行全局正则表达式匹配 preg_match - 进行正则表达式匹配 preg_split - 用正则表达式分割字符串 preg_replace - 执行正则表达式的搜索和替换 preg_replace_callback - 用回调函数执行正则表达式的搜索和替换 preg_match() 函数 函数原形: int preg_match(string $pattern, string $content ,array

17、$matches)preg_match()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其中。$matches0将包含与整个匹配的文本,$matches1将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只作一次匹配,最终返回0或1的判断是否匹配。 preg_replace() 函数原形: mixed preg_replace(mixed $patten,mixed $replacement,mixed $subject,int $limit) preg_replace其前三个参数均可以使用数组;第

18、四个参数$limit可以设置替换的次数,默认为全部替换。 preg_split() 函数原型: array preg_split (string $pattern,string $string,int $limit,int flags) 本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。 flags可选参数: PREG_SPLIT_NO_EMPTY:只返回非空的成分 PREG_SPLIT_DELIM_CAPTURE :定界符模

19、式中的括号表达式也会被捕获并返回 PREG_SPLIT_OFFSET_CAPTURE :对每个出现的匹配结果也同时返回其附属的字符串偏移量 函数原型: array preg_grep(string $pattern,array $input) preg_grep()函数返回一个数组,其中包括了$input数组中与$pattern正则表达式相匹配的单元(注:$input不能为null)。 对于输入数组$input中的每个元素,preg_grep()也只进行一次匹配。 电子邮件地址的校验电子邮件地址的校验 URL地址的校验地址的校验 电话号码和邮政编码的校验电话号码和邮政编码的校验 使用正则表达式

20、验证E-mail地址 在客户端实现验证Email是否合法,可以通过正则表达式实现。验证Email地址的正则表达式如下: /w+(-+.w+)*w+(-.w+)*.w+(-.w+)*/ 在JavaScript中使用正则表达式主要是通过正则表达式对象实现的,使用正则表达式对象的语法格式如下:语法1:re = /pattern/flags 语法2: re = new RegExp(pattern,flags) 该对象包含正则表达式模式以及表明如何应用模式的标志,该对象的参数说明如表2所示。参数值说明re必选项。将要赋值为正则表达式模式的变量名Pattern必选项。要使用的正则表达式模式。如果使用语法

21、1,用“/”字符分隔模式。如果用语法2,用引号将模式引起来flags可选项。如果使用语法2要用引号将flag引起来。标志可以组合使用,可以使用g(全文查找出现的所有pattern);i(忽略大小写);m(多行查找)使用Test方法regexp.test(str)可以返回一个Boolean值,它指出在被查找的字符串中是否存在模式。注意:在JavaScript中调用正则表达式时,正则表达式以正斜线“/”开头和结尾。本范例的实现步骤如下:(1)使用JavaScript编写一个用于检测Email地址是否正确的函数checkemail(),该函数只有一个参数email,用于获取输入的Email地址,返回

22、值为true或false。代码如下:function checkemail(email) var str=email; /在JavaScript中,正则表达式只能使用“/”开头和结束,不能使用双引号var Expression=/w+(-+.w+)*w+(-.w+)*.w+(-.w+)*/; var objExp=new RegExp(Expression); if(objExp.test(str)=true) return true; else return false; (2)调用checkemail()函数判断Email地址是否正确,并显示相应的提示信息。关键代码如下:function

23、check(myform) if(myform.e_mail.value=) alert(请输入Email地址!);myform.e_mail.focus(); if(!checkemail(myform.e_mail.value) alert(您输入Email地址不合法!);myform.e_mail.focus();return; myform.submit();使用正则表达式验证电话号码通过正则表达式验证电话号码是否正确,合法的电话号码如:其构造规则为3位数字-8位数字 或者其构造规则为4位数字-7位数字验证电话号码的正则表达式如下

24、: (d3-)(d8)$|(d4-)(d7)$ 其中,“d”代表任何ASCII数字,等价于09。3中的“3”表示匹配3次。“-”表示随后一个“-”;而“(d8)$”表示以8个数字结尾;“|”表示或者,指明两项之间的一个选择。 在JavaScript中使用正则表达式主要是通过RegExp对象实现的,在使用RegExp对象时,首先需要创建该对象并设置其相关属性,然后调用其Test方法返回输入的字符串中是否存在指定模式的布尔值True或False。本范例的实现步骤如下:(1)使用JavaScript编写一个用于检测电话号码是否正确的函数checkphone(),该函数只有一个参数tel,用于获取输入电话号码,返回值为True或False。代码如下:function checkphone(tel) var str=tel; /在JavaScript中,正则表达式只能使用“/”开

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论