正则表达式入门ailk.ppt
正则表达式入门,曹利锋,正则表达式是什么,描述了一种字符串匹配的模式,可以用来检查一个串是否含有某个子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。我们用过的最简单的规则:文件查找通配符:“?”和“*”,正则表达式的作用,测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。,第一个正则表达式,从英文小说中查找 hi但不能把him,high,history也找到,可以用bhibb表示匹配一个单词边界,如果是 bhiw*,那就找到了him,high,history假如你要找的是hi后面不远处跟着一个Lucy,你应该用bhib.*bLucyb。其中,.*连在一起就意味着任意数量的不包含换行的字符。,第二个正则表达式,三位区号八位机号的电话号码0dd-dddddddd其中d指的是数字可以简化为:0d2-d8 中表示的是重复的次数。,我们走到哪了?,我们现在有以下正则表达式的元字符bwd.*这些都是什么意思?,更进一步,d+匹配1个或更多连续的数字。下限是至少一次。而*的下限是0次再例:bw6b 匹配刚好6个字母/数字的单词。,常用的元字符,代码 说明.匹配除换行符以外的任意字符w 匹配字母或数字或下划线或汉字s 匹配任意的空白符d 匹配数字b 匹配单词的开始或结束 匹配字符串的开始$匹配字符串的结束,匹配QQ号,QQ号最少是5个数字,目前最长是12位数字,字符转义,要匹配正则表达式中用的字符,如这就需要转义,应当写成类似,我们还有:.*+等等,常用的限定符,代码/语法 说明*重复零次或更多次+重复一次或更多次?重复零次或一次n重复n次n,重复n次或更多次n,m重复n到m次,字符范围,xyz字符集合。匹配所包含的任意一个字符。a-z字符范围。匹配指定范围内的任意字符。所以 0-9代表的含意与d就是完全一致同理 a-z0-9A-Z_ 也完全等同于w(当然,这种等同只能仅考虑英文)例子:1.QQ号改正:QQ后首位不能为0 2.匹配(010)88886666,或022-22334455,或02912345678,反义,反义,有定义的元字符大写,即是反义,同样,字符集前加上也是反义。所以:代码/语法 说明W匹配任意不是字母,数字,下划线,汉字的字符S匹配任意不是空白符的字符D匹配任意非数字的字符B匹配不是单词开头或结束的位置x匹配除了x以外的任意字符a-z负值字符范围。匹配任何不在指定范围内的任意字符。,并列,用|表示或者,把每一个规则分开,用|合并为一组共用。例子:电话号码可以是3位区号8位号码,或4位区号7位号码0477-7192112,分组,字符可以指定重复次数,规则表达式如何指定重复次数?IP地址(d1,3.)3d1,3(d1,3.)这部分是1到3位数字加“.”,用括号表示为一个子表达式,并且3表示重复3次。,后向引用,使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组号保存的结果,实际如同程序中变量或数组保存数据一样。对组号的调用,如果是使用变量。,后向引用示例,后向引用用于重复搜索前面某个分组匹配的文本。例如,1代表分组1匹配的文本。难以理解?请看示例:b(w+)bs+1b可以用来匹配重复的单词,像go go,kitty kitty。首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(b(w+)b),然后是1个或几个空白符(s+),最后还是前面匹配的那个单词(1)。,命名分组,()内的子表达式,不仅可以用编号,也可以用名称,如同变量有变量名。(?w+)(?Wordw+)或内均是分组名称,这样。下面的例子:b(?w+)bs+kb(?#变量声明标志Word#变量名w+#表达式),分组语法-捕获,(exp)匹配exp,并捕获文本到自动命名的组里(?exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?nameexp)(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号,零宽断言,表达式结构:(?=exp)匹配exp前面的位置,即某表达式后面是exp(?=exp)匹配exp后面的位置,即某表达式前面是exp(?!exp)匹配后面跟的不是exp的位置,即某表达式后面不是exp(?!exp)匹配前面不是exp的位置,即某表达式前面不是exp实例bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分):dancing,reading(?=bre)w+b会匹配以re开头的单词的后半部分(除了re以外的部分),read,return,注释,小括号的另一种用途是能通过语法(?#comment)来包含注释。如:(d1,2(?#0-99)|1dd(?#100-199)|20-4d(?#200-249)|250-5.)3(?#250-255)(d1,2(?#-0-99)|1dd(?#100-199)|20-4d(?#200-249)|250-5)(?#250-255)$,贪婪与懒惰,当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。,贪婪与懒惰,有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。,贪婪与懒惰,对于aababa.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab(为什么第一个匹配是aab而不是ab?简单地说,因为正则表达式有另一条规则,比懒惰贪婪规则的优先级更高:最先开始的匹配最有最大的优先权,懒惰限定符,*?重复任意次,但尽可能少重复+?重复1次或更多次,但尽可能少重复?重复0次或1次,但尽可能少重复n,m?重复n到m次,但尽可能少重复n,?重复n次以上,但尽可能少重复,优先级顺序,操作符 描述 转义符(),(?:),(?=),圆括号和方括号*,+,?,n,n,n,m 限定符,$位置和顺序|“或”操作,JS中的应用,1.js里面通过RegExp类来实现正则表达式的。/匹配串中第一个catvar reCat=new RegExp(cat);/匹配串中所有的catvar reCat=new RegExp(cat,g);/匹配串中所有的cat,不区分大消息 var reCat=new RegExp(cat,gi);var reCat=/cat/gi;/perl风格,JS中的应用,2.RegExp的方法(1)test()判断是否匹配,返回 true 或者 false var sTomatch=cat;var reCat=/cat/;alert(reCat.test(sTomatch);/outputs true(2)exec()返回一个数组,数组中的第一个条目是第一个匹配 var sTomatch=a bat,a Cat,a fAt baT,a faT cat;var reAt=/at/;var arrMatches=reAt.exec(sTomatch);alert(arrMatches.toString();/outputs at,JS中的应用,String对象对正则表达式的支持(1)match()方法 var sTomatch=a bat,a Cat,a fAt baT,a faT cat;var reAt=/at/gi;var arrMatches=sTomatch.match(reAt);alert(arrMatches.toString();/outputs at,at,At,aT,aT,at;,JS中的应用,(2)replace()方法 var sToChange=“this red paper is not very red”;alert(sToChange.replace(“red”,“blue”);只替换第一个“red”,outputs“this blue paper is not very red”要想全部替换,使用全程修正符,如下:var sToChange=this red paper is not very red;var reRed=/red/gi;alert(sToChange.replace(reRed,blue);,JS中的应用,(3)split()方法 var sColor=“red,blue,yellow,green”;var reCom=/,/;/因为“,”是正则表达式的语法元字符,所以用“”来转义(注:也可以不转义,因为“,”不是用于匹配的。)var arrColors=sColor.split(reCom);上面方法的效果等同于 var sColor=red,blue,yellow,green;var arrColors=sColor.split(,);,谢谢大家,