版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、什么是正则表达式: 简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。 在某个Linux网站上面有这样的话:如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。 正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,
2、但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了正则表达式 正则表达式是一个非常大的题目,Perl的正则表达式的强大是闻了名的。而PHP也不弱,他继承了Perl的正则表达式法则,还有自己的一套法则。这里只说PHP自己的正则表达式。 正则表达式是最基本的元素。简单地说就是一套规则,用于去判定其它的元素是不是符合自身的规则,或者说是不是有相同的特征描述。 正则表达式的开始符:,结尾符$,这两个符号间的是匹配的元素。如检查一个电话号码是不是打往北京的号,用正则表达式表示就是“010$”。只要
3、前3位区号是010,就是北京的号,后面的电话号码就不用管了。然后,用正则表达式匹配函数ereg来判断,例: 这就是正则表达式。北京的电话都是8位数字的,那我要知道这个号码是不是正确了?假如他按了9位号呢?如果判断正误?这就要用到正则表达式的字符簇。那么上例的正则表达式就要这样写:0100-98$,就能同时判断号码是不是符合规则。正则表达式有很多的应用,像LBB、VBB论坛在发贴时的所谓VBB代码LBB代码的解析,都是用正则表达式完成的。什么是正则表达式?你对从一个不错的老的基于控制的文本编辑器中分离出像BBEdit和notepad的程序,有什么看法呢?两个都支持文本输入,可以让你保存文本到文件
4、中,但是现在的文本编辑器也支持其它功能,包括查找代替工具,这让编辑一个文本文件相当容易。正则表达式也是相似的,只是更好一些。正则表达式可以被认为一个极其高级的查找-替换工具,让我们从痛苦中摆脱出来:不必再写定制的数据确认例子来检查电子邮件地址或者来确认电话号码的格式是正确的,如此等等。任何程序中最普通的函数之一就是数据有效性检查,PHP捆绑了一些文本检查函数,允许我们用正则表达式匹配一个字符串,确认有一个空格,有一个问号,等等。你不知道的可能是,正则表达式可以简单装备吗,当你掌握了一些正则表达式时(这个正则表达式可以用来告诉正则表达式引擎一个字符串中我们想要匹配的部分),你会自问为什么会把正则
5、表达式扔到角落里这么久,_。PHP有两套函数,用来处理两种类型的正则表达式:Perl5兼容模式,和Posix标准兼容模式。在这篇文章中我们将看看ereg函数,用遵照Posix标准的搜索表达式工作。虽然它们并没有Perl5模式那样强大,但是一种不错的学习正则表达式的方法。如果你对PHP支持的Perl5兼容正则表达式感兴趣,可以到PHP.net网站找一些关于preg函数的细节。PHP有六个函数来处理正则表达式,它们都把一个正则表达式作为它们的第一个参数,列出如下:ereg: 最常用的正则表达式函数, ereg 允许我们搜索跟一个正则表达式匹配的一个字符串. ereg_replace: 允许我们搜索
6、跟正则表达式匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方。 eregi: 和ereg几乎是一样效果,不过忽略大小写。 eregi_replace: 和ereg_replace有着一样的搜索-替换功能,不过忽略大小写. split: 允许我们搜索和正则表达式匹配的字符串,并且以字符串集合的方式返回匹配结果. spliti: split函数忽略大小写的版本.为什么使用正则表达式? 如果你不断地建立不同的函数来检查或者操作字符串的一部分,现在你可能要放弃所有的这些函数,取而代之的用正则表达式。如果你对下列的问题都答“是的”,那么你肯定要考虑使用正则表达式了:你是否正在写一些定制的函数
7、来检查表单数据(比如在电子信箱地址中的一个,一个点)? 你是否写一些定制的函数,在一个字符串中循环每个字符,如果这个字符匹配了一个特定特征(比如它是大写的,或者它是一个空格),那么就替换它?除了是令人不舒服的字符串检查和操作方法,如果没有有效率地写代码,上述的两条也会使你的程序慢下来。你是否更倾向于用下面的代码检查一个电子信箱地址呢:. 或者使用下面的代码:可以肯定的是,第一个函数比较容易,而且看起来结构也不错。但是如果我们用上面的下一个版本的email地址检查函数不是更容易吗?上面展示的第二个函数只用了正则表达式,包括了对ereg函数的一个调用。Ereg 函数返回true或者false,来声
8、明它的字符串参数是否和正则表达式相匹配。很多编程者避开正则表达式,只因为它们(在一些情况下)比其它的文本处理方法更慢。正则表达式可能慢的原因是因为它们涉及把字符串在内存中拷贝和粘贴,因为正则表达式的每一个新的部分都对应匹配一个字符串。但是,从我对正则表达式的经验来说,除非你在文本中几百个行运行一个复杂的正则表达式,否则性能上的缺陷都可以忽略不计,当把正则表达式作为输入数据检查工具时,也很少出现这种情况。正则表达式语法在你可以匹配一个字符串到正则表达式之前,你必须先建立正则表达式。开始的时候,正则表达式的语法有点古怪,表达式中的每一个短语代表某个类型的搜索特征。下列是一些最普通的正则表达式,也都
9、对应着一个如何使用它的例子:字符串头部搜索一个字符串的头部,用,例如将返回 true, 但是将返回 false, 因为hello不在字符串”I say hello world”的头部。字符串尾部 搜索字符串尾部,用$,例如: 将返回true, 但是将返回 false,因为bye不在字符串”goodbye my friend”的尾部.任意的单个字符 搜索任意字符,用点(.),例如:将返回true,但是将返回false,因为我们的要搜索字符串没有包含字符。你可以用花括号随意告诉正则表达式引擎它要匹配多少个单个字符。如果我只想匹配5个字符,我可以这样用ereg:上面的这段代码告诉正则表达式引擎当且仅
10、当至少5个连续的字符出现字符串的尾部时返回true.我们也可以限制连续出现的字符的数目:在上面的例子里,我们已经告诉正则表达式引擎,我们的搜索字符串来匹配表达式,它在尾部必须有介于1和3个的”a”字符。上面的例子将不会返回true,虽然有三个”a”字符在搜索字符串里,但是它们不是在字符串的尾部。如果我们把结尾字符串匹配$从正则表达式中去掉,那么这个字符串是匹配的。我们也可以告诉正则表达式引擎来匹配至少有确定数目的字符在一行,如果它们存在的,可以匹配更多。 我们可以这样做:零或多次重复字符为了告诉正则表达式引擎一个字符可能存在,也可以重复,我们用*字符。这里的两个例子都将返回true. 即使第二
11、个例子不包含”t”这个字符,但仍旧返回ture,因为*表示字符可以出现,但不是必须出现。事实上,任何普通的字符串模式都会使上面的ereg调用返回true,因为t字符是可选的.一或多次重复字符为了告诉正则表达式引擎一个字符必须存在,也可以重复不止一次,我们用+字符,像下面的例子也会返回true:零或一次重复字符 我们也可以告诉正则表达式引擎,一个字符必须是或者只存在一次,或者没有。我们用?字符来做这项工作,就像如果我们愿意,我们完全可以从上面的搜索字符串中删除c,这个表达式会仍旧返回true.? 的意思是一个c可以出现在搜索字符串的任何地方,但不是必须的。正则表达式语法 (续) 空格字符 为了匹
12、配一个搜索字符串中的空格字符,我们用预定义Posix的类,:space.方括号标明连续字符的相关性,”:space:”是实际要匹配的类(在这种情形下,是任何空白字符)。空白包括tab字符,新行字符,空白字符。或者,如果搜索字符串必须包含只有一个空格,而不是一个tab或者新行字符,你可以用一个空格字符( )。在大多数情况下,我倾向于使用:space:,因为这意味着我的意图不仅仅是单个空格字符,这点很容易被忽视。这里有一些Posix-标准预定义类,有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类,包括:alnum:, :digit:, :lower:等等。 完整的列表可以在这里查看
13、我们可以像这样匹配单个空白字符:我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。模式分组相关的模式可以在方括号里分在一起。很容易用a-z和A-Z指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。或者像我们也可以告诉正则表达式引擎,我们希望或者是小写字母,或者是大写字母。我们只要把a-z和A-Z模式结合在一起就可以做到。在上面的例子里,如果我们能匹配John Doe,而不是JohnDoe,将是非常有意义的。我们用下面的正则表达式来做这个:a-zA-Z+:space:1a-zA-Z+$很容易搜索一个数字字符串词语分组 不仅仅搜索模式可以分组,我们也可以用圆
14、括号把相关的搜索词语进行分组。在上面的例子中,我们有一个字符串头部字符,紧跟着John或者Jane,至少有一个其它字符,然后一个字符串尾部字符。所以.将也匹配我们的搜索模式特殊字符的情形因为一些字符要用在一个搜索模式的明确分组或者语法上,像在(John|Jane)中的圆括号,我们需要告诉正则表达式引擎来屏蔽这些字符,加工它们使之成为被搜索字符串的一部分,而不是搜索表达式的一部分。我们所用的方法称为“字符转义”,涉及到将任何“专用符号”加上反斜杠。所以,例如,如果我想在我的搜索中包含|,那么我就可以这样做这里只是少量的一些你要转义的字符,你必须转义, $, (, ), ., , |, *, ?,
15、 +, and 。希望你现在对正则表达式实际上有多么强大有了一点点感觉了。现在让我们看两个用正则表达式来检查数据中一个字符串的例子。正则表达式例子例子1 让我们把第一个例子做的相当简单,检验一个标准的URL.一个标准的URL(没有端口号),有三个部分构成:协议:/域名让我们从匹配URL的协议部分开始,并且让它只能用http或者ftp.我们可以用下面的正则表达式做到这点:(http|ftp)字符特指字符串的头部,利用圆括号把http和ftp围住,且用“或者”符号(|)将它们分开,我们告诉正则表达式引擎http和ftp两者之一必须在字符串的开头。一个域名通常由构成,
16、但是可以随意选择要不要www部分。为了例子简单,我们只允许.com,.net,和.org的域名是在考虑之中的。我们最好这样对正则表达式中的域名部分表示如下:(www.)?.+.(com|net|org)$把所有的东西放在一起,我们的正则表达式就可以用作检查一个域名,如:例子二 因为我居住在澳大利亚悉尼,让我们检查一个典型的澳大利亚国际电话号码。澳大利亚国际电话号码的格式如下:+61x xxxx-xxxx第一个x是区号,其它的都是电话号码。检查以+61开头且紧跟一个在2到9之间的区号的电话号码,我们用下面的正则表达式:+612-9:space:注意,上面的搜索模式把+字符用转义,以便于可以在搜索
17、中包含,不至于被解释为一个正则表达式。2-9告诉正则表达式引擎我们需要包含一个2到9之间的数字。:space:类则告诉正则表达式期望在这里有一个空白。这里是电话号码剩下的搜索模式:0-94-0-94$这里没有什么不寻常的地方,我们只是告诉正则表达式引擎电话号码可用的数字,它必须是4个数字的组合,跟着一个连接符,再跟着另一个4个数字的组合,然后一个字符串尾部字符。把完整的正则表达式放在一起,放进一个函数,我们可以用代码来检查一些澳大利亚国际电话号码:总结正则表达式用一些不适合书写和重复的代码来检查一个字符串。在最后的几页里,我们已经讲解了所有的Posix标准正则表达式的基础,包括字符,分组和PH
18、P ereg函数。我们也知道了怎么用正则表达式来检查一些PHP中简单的字符串。3 正则表达式的基本语法: 一个正则表达式,分为三个部分:分隔符,表达式和修饰符。 分隔符可以是除了特殊字符以外的任何字符(比如/ !等等),常用的分隔符是/。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如a-z0-9_-+a-z0-9_-.+可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子:/hello.+?hello/is 上面的正则表达式/就是分隔符,两个/之间的就是表达式,第二个/后面的字符串is就是修饰符。 在表达式中如果含有分
19、隔符,那么就需要使用转义符号,比如/hello.+?/hello/is。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要来转义,比如d代表全体数字。4 正则表达式的特殊字符: 正则表达式中的特殊字符分为元字符、定位字符等等。 元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。元字符: 大括号:大括号用来精确指定匹配元字符出现的次数,例如/pre1,5/表示匹配的对象可以是pre、pree、preeeee这样在pr后面出现1个到5
20、个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的字符串。?在正则表达式中还有一个非常重要的作用,即贪婪模
21、式。 还有两个很重要的特殊字符就是 。他们可以匹配之中出现过的字符,比如/az/可以匹配单个字符a或者z;如果把上面的表达式改成这样/a-z/,就可以匹配任何单个小写字母,比如a、b等等。 如果在中出现了,代表本表达式不匹配内出现的字符,比如/a-z/不匹配任何小写字母!并且正则表达式给出了几种的默认值::alpha::匹配任何字母:alnum::匹配任何字母和数字:digit::匹配任何数字:space::匹配空格符:upper::匹配任何大写字母:lower::匹配任何小写字母:punct::匹配任何标点符号:xdigit::匹配任何16进制数字另外下面这些特殊字符在转义符号转义后代表的含
22、义如下:s:匹配单个的空格符S:用于匹配除单个空格符之外的所有字符。d:用于匹配从0到9的数字,相当于/0-9/。w:用于匹配字母,数字或下划线字符,相当于/a-zA-Z0-9_/。W:用于匹配所有与w不匹配的字符,相当于/a-zA-Z0-9_/。D:用于匹配任何非10进制的数字字符。.:用于匹配除换行符之外的所有字符,如果经过修饰符s的修饰,.可以代表任意字符。 利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如/d0000/利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。定位字符: 定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置
23、进行描述。:表示匹配的模式出现在匹配对象的开头(和在里面不同)$:表示匹配的模式出现在匹配对象的末尾空格:表示匹配的模式出现在开始和结尾的两个边界之一/he/:可以匹配以he字符开头的字符串,比如hello、height等等;/he$/:可以匹配以he字符结尾的字符串即she等;/ he/:空格开头,和的作用一样,匹配以he开头的字符串;/he /:空格结束,和$的作用一样,匹配以he结尾的字符串;/he$/:表示只和字符串he匹配。括号: 正则表达式除了可以用户匹配,还可以用括号()来记录需要的信息,储存起来,给后面的表达式读取。比如:/(a-zA-Z0-9_-+)(a-zA-Z0-9_-+
24、)(.a-zA-Z0-9_-)$/就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为之类的),在后面如果想要读取记录下来的字符串,只是需要用转义符记录的次序来读取。比如1就相当于第一个a-zA-Z0-9_-+,2相当于第二个(a-zA-Z0-9_-+),3就是第三个(.a-zA-Z0-9_-)。但是在PHP中,是一个特殊的字符,需要转义,所以1到了PHP的表达式中就应该写成1。其他特殊符号:|:或符号|和PHP里面的或一样,不过是一个|,而不是PHP的两个|!意思就是可以是某个字符或者另一个字符串,比如/abcd|dcba/可能匹配abcd或者dcba
25、。5 贪婪模式:前面在元字符中提到过?还有一个重要的作用,即贪婪模式,什么是贪婪模式呢?比如我们要匹配以字母a开头字母b结尾的字符串,但是需要匹配的字符串在a后面含有很多个b,比如a bbbbbbbbbbbbbbbbb,那正则表达式是会匹配第一个b还是最后一个b呢?如果你使用了贪婪模式,那么会匹配到最后一个b,反之只是匹配到第一个b。 使用贪婪模式的表达式如下:/a.+?b/a.+b/U不使用贪婪模式的如下:/a.+b/上面使用了一个修饰符U,详见下面的部分。6 修饰符: 在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着e
26、并不等于E)。正则表达式里面的修饰符如下:i :如果在修饰符中加上i,则正则将会取消大小写敏感性,即a和A 是一样的。m:默认的正则开始和结束$只是对于正则字符串如果在修饰符中加上m,那么开始和结束将会指字符串的每一行:每一行的开头就是,结尾就是$。s:如果在修饰符中加入s,那么默认的.代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说/a/A匹配
27、abcd。E:与m相反,如果使用这个修饰符,那么$将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。U:和问号的作用差不多,用于设置贪婪模式。7 PCRE相关的正则表达式函数:PHP的Perl兼容正则表达式提供的多个函数,分为模式匹配,替换和匹配数目等等:1、preg_match :函数格式:int preg_match(string pattern, string subject, array matches);这个函数会在string中使用pattern表达式来匹配,如果给定了regs,就会将string记录到regs0中,regs1代表使用括号()记录下来的第一个字符串,r
28、egs2代表记录下来的第二个字符串,以此类推。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
29、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
30、地址的格式是否正确:?phpfunction emailIsRight($email) if (preg_match(_.0-9a-z-+(0-9a-z0-9a-z-+.)+a-z2,3$,$email) return 1;return 0;if(emailIsRight() echo 正确;if(!emailIsRight(y10kfffff) echo 不正确;?上面的程序会输出正确不正确。8.PHP中的Perl兼容正则表达式和Perl/Ereg正则表达式的区别: 虽然叫做“Perl兼容正则表达式”,但是和Perl的正则表达式相比,PHP的还是由一些不同,比如修饰符“
31、G”在Perl里面代表全部匹配,但是在PHP中没有加入对这个修饰符的支持。 还有就是和ereg系列函数的区别,ereg也是PHP中提供的正则表达式函数,不过和preg相比,要弱上很多。 1、ereg里面是不需要也不能使用分隔符和修饰符的,所以ereg的功能比preg要弱上不少。 2、关于.:点在正则里面一般是除了换行符以外的全部字符,但是在ereg里面的.是任意字符,即包括换行符!如果在preg里面希望.能够包括换行符,可以在修饰符中加上s。 3、ereg默认使用贪婪模式,并且不能修改,这个给很多替换和匹配带来麻烦。 4、速度:这个或许是很多人关心的问题,会不会preg功能强大是以速度来换取的
32、?不用担心,preg的速度要远远比ereg快,笔者做了一个程序测试: time test: PHP代码: ?phpecho Preg_replace used time:; $start = time(); for($i=1;$i=;$i+) $str = ssssssssssssssssssssssssssss; preg_replace(/s/,$str); $ended = time()-$start; echo $ended; echo ereg_replace used time:; $start = time(); for($i=1;$i=;$i+) $str = ssssssss
33、ssssssssssssssssssss; ereg_replace(s,$str); $ended = time()-$start; echo $ended; echo str_replace used time:; $start = time(); for($i=1;$i 结果: Preg_replace used time:5 ereg_replace used time:15 str_replace used time:2 str_replace因为不需要匹配所以速度非常快,而preg_replace的速度比ereg_replace要快上不少。php正则表达式定义 正则表达式(regu
34、lar expression_r_r_r)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 列目录时,dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 3.1 普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。 3.2 非打印字符字
35、符含义cx匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 c 字符。f匹配一个换页符。等价于 x0c 和 cL。n匹配一个换行符。等价于 x0a 和 cJ。r匹配一个回车符。等价于 x0d 和 cM。s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 fnrtv。S匹配任何非空白字符。等价于 fnrtv。t匹配一个制表符。等价于 x09 和 cI。v匹配一个垂直制表符。等价于 x0b 和 cK。 3.3 特殊字符所谓特殊字符,就是一些有特殊含义的字符,如上面说的”*.txt”中的*,简单
36、的说就是表示任何字符串的意思。如果要查找文件名中有的文件,则需要对进行转义,即在其前加一个。ls *.txt。正则表达式有以下特殊字符。特别字符说明$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 n 或 r。要匹配 $ 字符本身,请使用 $。( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。.匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。标记一个中括号表
37、达式的开始。要匹配 ,请使用 。?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, n 匹配字符 n。n 匹配换行符。序列 匹配 “”,而 ( 则匹配 “(”。匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 字符本身,请使用 。标记限定符表达式的开始。要匹配 ,请使用 。|指明两项之间的一个选择。要匹配 |,请使用 |。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式
38、的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。 3.4 限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或n或n,或n,m共6种。 *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。 正则表达式的限定符有:字符描述*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于0,。+匹配前面的子表达式一次或多次。例如,zo+ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 1,。?匹配前面的子表达式零次或一次。
39、例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 0,1。nn 是一个非负整数。匹配确定的 n 次。例如,o2 不能匹配 “Bob” 中的 o,但是能匹配 “food” 中的两个 o。n,n 是一个非负整数。至少匹配n 次。例如,o2, 不能匹配 “Bob” 中的 o,但能匹配 “foooood” 中的所有 o。o1, 等价于 o+。o0, 则等价于 o*。n,mm 和 n 均为非负整数,其中n = m。最少匹配 n 次且最多匹配 m 次。例如,”o1,3” 将匹配 “fooooood” 中的前三个 o。o0,1 等价于 o?。请注意在逗号和两个数之间
40、不能有空格。 3.5 定位符用来描述字符串或单词的边界,和$分别指字符串的开始与结束,b描述单词的前或后边界,B表示非单词边界。不能对定位符使用限定符。 3.6 选择用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 3.7 后向引用对一个正则表达式模式或部分模式两边添加圆括
41、号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。 可以使用非捕获元字符 ?:, ?=, or ?! 来忽略对相关匹配的保存。4. 各种操作符的运算优先级 相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:操作符描述转义符(), (?:), (?=), 圆括号和方括号*, +, ?, n, n, n,m限定符, $, anymetacharact
42、er位置和顺序|“或”操作5. 全部符号解释字符描述将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,n 匹配字符 “n”。n 匹配一个换行符。序列 匹配 “” 而 “(” 则匹配 “(”。匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性, 也匹配 n 或 r 之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 n 或 r 之前的位置。*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于0,。+匹配前面的子表达式一次或多次。
43、例如,zo+ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 1,。?匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 0,1。nn 是一个非负整数。匹配确定的 n 次。例如,o2 不能匹配 “Bob” 中的 o,但是能匹配 “food” 中的两个 o。n,n 是一个非负整数。至少匹配n 次。例如,o2, 不能匹配 “Bob” 中的 o,但能匹配 “foooood” 中的所有 o。o1, 等价于 o+。o0, 则等价于 o*。n,mm 和 n 均为非负整数,其中n = m。最少匹配 n 次且最多匹配 m
44、 次。例如,”o1,3” 将匹配 “fooooood” 中的前三个 o。o0,1 等价于 o?。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符 (*, +, ?, n, n, n,m) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,o+? 将匹配单个 “o”,而 o+ 将匹配所有 o。.匹配除 “n” 之外的任何单个字符。要匹配包括 n 在内的任何字符,请使用象 .n 的模式。(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matche
45、s 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0$9 属性。要匹配圆括号字符,请使用 ( 或 )。(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, industr(?:y|ies) 就是一个比 industry|industries 更简略的表达式。(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,Windows (?=95|98|NT|2000) 能匹配 “Windows 2000 中的 “Windows” ,但不能匹配 “Windows 3.1 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如Windows (?!95|98
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- PHP开发工程师WEB程序员职位描述与岗位职责任职要求
- NZ514生铁断裂机操作规程
- 重庆人文科技学院《美术鉴赏》2021-2022学年第一学期期末试卷
- 重庆财经学院《网络营销学》2021-2022学年期末试卷
- 重庆财经学院《数字媒体技术》2021-2022学年期末试卷
- 茶叶买卖管制措施方案
- 茶业市场营销研究报告
- 缠绕膜行业研究报告
- 重庆财经学院《大数据技术原理与应用》2021-2022学年期末试卷
- 炒粉炒饭课程设计
- 小红书推广协议合同模板
- 2024国际海外销售代理合同范本
- 人教版(2024)七年级上册生物《综合实践项目 利用细菌或真菌制作发酵食品》教学设计
- 超长期特别国债项目
- 中班美术活动课件《秋天的树林》
- 【课件】Unit+5Lesson+6+Reading+Plus+课件人教版七年级英语上册
- 2024年建筑电工考试题库附答案
- 10.2 滋养心灵 课件-2024-2025学年统编版道德与法治七年级上册
- 西汉建立和“文景之治”课件 2024~2025学年统编版(2024)七年级历史上册
- 新编小学(部编版)语文六年级上册全册课时练(含答案)
- 第5课 用发展的观点看问题-【中职专用】2024年中职思想政治《哲学与人生》金牌课件(高教版2023·基础模块)
评论
0/150
提交评论