JS正则表达式完整版_第1页
JS正则表达式完整版_第2页
JS正则表达式完整版_第3页
JS正则表达式完整版_第4页
JS正则表达式完整版_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第1页2012-6-1正则表达式正则表达式第2页2012-6-1字符串对象 在JS中字符串型是一个基本的数据类型, 而字符串对象(String Object)可以将字符串打包成一个对 象。 将字符串打包成对象之后,就可以调用字符串对象中的方法。 在JS中,可以隐藏地将一个字 符串转换为字符串对象。 因此,字符串对象中的方法和属性可以由字符串直接引用, 而不需要先将字符串转换成字符串对象。第3页2012-6-1字符串对象的构造函数StringObjectName= new String(value);variableName=String(value);当使用new运算符时,String()作为

2、构造函数使用。此时可以将value参数转换成一个字符串,并返回一个包含该字符串的字符串对象,此时StringObjectName是一个对象名。在没有使用new运算符时,String()只是作为一个函数使用。该函数的作用是将value参数转换成一个字符串并将字符串返回。第4页2012-6-1第5页2012-6-1第6页2012-6-1搜索子字符串在字符对象中,提供了很多返回字符串的子字符串的方法,这些方法可以满足多种不同的搜索子字符串的需要。字符串对象中返回子字符串的方法有:charAt()slice();substr();substring();var str=这是一个字符串;/返回第三个字符

3、document.write(str.charAt(2)+);/返回第五个字符document.write(str.charAt(5)+);document.write(str.charAt(20)+);第7页2012-6-1substr()方法的使用var str=这是一个字符串; /返回从第3个字符开始,长度为3的子字符串document.write(str.substr(2,3)+); /返回从倒数第5个字符开始,长度为3的子字符串document.write(str.substr(-5,3)+);第8页2012-6-1substring()方法的使用var str=这是一个字符串;/返

4、回第3个字符到第5个字符之间的子字符串document.write(str.substring(2,5)+);/以下语句就返回空字符串document.write(str.substring(5,5)+);/从第3个到最后一个字符之间的子字符串document.write(str.substring(2)+); 第9页2012-6-1indexOf()方法和lastIndexOf()的使用var str=Define a class with a class definition.;/第1次出现class的位置document.write(str.indexOf(class)+);/从第11个

5、字符开始,第1次出现classdocument.write(str.indexOf(class,10)+);/第1次出现classes的位置document.write(str.indexOf(classes)+);/最后1次出现class的位置document.write(str.lastIndexOf(class)+);/从第11个字符开始向前搜索,最后1次出现class的位置document.write(str.lastIndexOf(class,10)+);第10页2012-6-1 replace()方法的使用 var oldstr=Define a class with a clas

6、s definition.; document.write(oldstr,); /替换子字符串 var newstr=oldstr.replace(class,abc); /显示结果 document.write(newstr,); 第11页2012-6-1 转换大小写 / /原始字符串 var oldstr=Define a class with a Class definition; /转换为大写 document.write(oldstr.toUpperCase(); / /转换为小写 document.write(oldstr.toLowerCase(); 第12页2012-6-1 正

7、则表达式 正则表达式简介 正则表达式主要作用是用来匹配字符串。 由于其简单并且功能强大, 因此正则表达式不仅仅可以在JS中使用, 众多高级语言(如java、等)都加入了正则表达式的支持。第13页2012-6-1正则表达式的作用前面介绍过的表单验证方法很简单。例如,可以使用String对象的length属性是否为0来判断用户是否在文本框中输入了文字,或者判断用户输入文字的长度是否达到要求。假设表单中有一个要求输入身体号码文本框,目前的身份证号码长度有两种,分别为15位和18位的。那么可以通过以下代码来判断用户输入身份证号码长度是否正确。if(myForm.myText.value.lenght=

8、15|myForm.myText.value.lenght=18)如果用户输入的身份证号码并不是数字,而是字母的话,使用以上方法就不能正确判断了。而使用正则表达式,就可以很方便地判断用户输入身份证号码格式是否正确。正则表达式除了可以验证数据的效性之外,还常用来搜索、替换文本,或者从文本中提取了字符串。第14页2012-6-1 正则表达式的工作原理正则表达式的工作原理比较简单,使用的是通配符匹配技术。通配符在计算机中应用比较多的是查找文件。当要查找一个文件而记不清文件时,通常就使用通配符的方式来查找。第15页2012-6-1 正则表达式的语法正则表达式是由普通字符和一些无字符组成的文字模式。其中

9、普通字符就是在程序里常用到的字符,如字母、数字等。无字符是一些有特别是一些有特别含义的特殊符号,这些元字符可以在查找文本时匹配一个或多个字符串。将普通字符和元字符放在一对斜框(/)中就可以创建一个正则表达式的直接量。可以将正则表达式看成是一个模板,使用该模型可以匹配多个文本。第16页2012-6-1 字符与字符串在正则表达式中,一种最简单的匹配方法就是字符与自身的匹配。例如:正则表达式/a/匹配字符a、正则表达式/b/匹配字符b。数字也可以进行这样的匹配,例:正则表达式/1/匹配数字1。除了单个字符之外,字符串也可以与其自身匹配。例如:正则表达式/abc/匹配字符串abc等。但是在正则表达式中

10、,有很多字符是具有特殊含义的字符,如* ?可以用来匹配多个字符和一个字符,这些字符就不能用于匹配其自身。对于这些符号,就必胜使用反斜扛()来进行匹配。如正则表达式/*/可以匹配字符*,正则表达式/(/可以匹配字符(。在正则表达式中,这些特殊的符号如下所示:! $ * + = | . ? / ( ) 第17页2012-6-1第18页2012-6-1第19页2012-6-1例:以下三行正则表达式可以分别匹配字符串“abc”、abc.txt和Whats your name?。/abc/abc.txt/Whats your name?/第20页2012-6-1字符类正则表达式中的字符类可以代表一系列的

11、字符。一个字符类可以与其所包含的任何字符相匹配。创建字符类的方式很简单,只要将要匹配的字符放入方括号中即可。例如:正则表达式“/abc/”就是一个字符类,可以匹配字母a、b、c也可以与字符串apple中的a字符匹配。除了可以将要匹配的字符放大方括号中之外,还可以使用-来指定要匹配的字母范围,如以下4行正则表达式所示。这4行正则表达式分别可以匹配小写字母a到h、大写字母A到Z、数字1到9、所有的小写字母(a到z)和大写字母(A到Z)。/a-h/A-Z/1-9/a-zA-Z/第21页2012-6-1在字符类中,可以使用来代表排除性的匹配,类似于非,即不包括在方括号中字符之外的所有字符,如以下两行正

12、则表达式所示。以下正则表达式中,第一行正则表达式可以匹配除小写字母a、c、e之鼐的所有字符。第二行正则表达式可以匹配除大写字母A到Z之外的所有字符。/ace/A-Z/第22页2012-6-1正则表达式的字符类第23页2012-6-1虽然正则表达式中的每个字符类都可以匹配一系列字符,但是每个字符类可以匹配的字符数只能有一个。例如以下正则表达式中,可以匹配的字符有a、b、c也可以匹配字符串abc中的任何一个字符,但是不能匹配整个abc字符串。/abc/如果要匹配多个字符,可以多次使用字符类,例如以下正则表达式中,第1行正则表达式可以匹配“第1章”到第9章几个字符串,而第2行和第3行正则表达式中可以

13、匹配“第10章”到第99章几个字符串。/第1-9章/第1-90-9章/第1-9d章/第24页2012-6-1重复类字符与字符类都只能匹配单个字符,例如正则表达式/d/可以匹配数字0-9,如果要匹配一个两位数,就必须使用两次d也就是正则表达式/dd/。如果要匹配一个四位数,那就要使用/dddd/如果要匹配一个18位的身份证号码,那就要使用18次“d”。为了解决以上问题,在正则表达式中提供了重复类,使用重复类可以指定字符要重复的次数。最常见的重复类为?和*,其中*代表可以匹配前一个字符0次或多次。例如/ad*/可以匹配a、ab、add等字符。而?可以匹配前一个字符0次或1次。例如/ad?/可以匹配

14、a,ad但不能匹配add。使用*或?重复类所匹配的方式十分有限,因此,正则表达式中添加了一些其他的重复类。第25页2012-6-1第26页2012-6-1使用重复类可以匹配最多的字符串。例如,一本书中的章节数不确定,如果不使用重复类,那么就无法匹配所有的单节,以下正则表达式就可以匹配所有不确定的单节。在该正则表达式中,d*代表数字0-9可以出现0次或多次。那么无论一本书中的单节数是多少,该正则表达式都能与其匹配。/第1-9d*章/第27页2012-6-1选择符正则表达式的选择符为|,该选择符用于分隔可以用来选择的文字。如以下正则表达式可以匹配字符串index、default或list。/ind

15、ex|default|list/需要注意的是,正则表达式选择符的匹配方式为从左至右,一旦发现有可以匹配的字符串则会停止匹配。例如,以上正则表达式将会匹配以下字符串的index,而不会匹配default。通常一个网站的首页为index.html或defalult.html第28页2012-6-1定位符前面介绍的正则表达式都可以在全文中进行搜索。例如,使用以下正则表达式可以匹配文章中所有单节的标题(如第1章)。但是,在文章的正文中也有可能引用了章节名(如“正如第1章中所述”),此时以下正则表达式并不能识别出匹配的文字是文章的标题,还是章节的正文。/第1-9d*章/仔细我们会发现文章的标题可以发现,

16、通常文章的标题都会单独占有一行。在正则表达式中,提供了和$两个定位符。其中定位符可以匹配一行的开始,$定位符可以匹配一行的结尾。由于文章中的标题通常都是独占一行,所以要匹配文章中的所有标题,可以使用以下正则表达式。/第1-9d*章/第29页2012-6-1第30页2012-6-1分组正则表达式中,使用小括号可以对匹配符进行分组。将匹配符进行分组之后,可以像一个独立的字符那样进行重复类的操作。例如,以下正则表达式可以匹配字符串“boy”或boyfriend。/boy(frined)0,1/在以下正则表达式中的friend字符串加上了小括号,因此可以将整个friend字符串当成一个字符,再使用0,

17、1重复类指定该字符串可以出现0次或1次。如果不使用小括号,如以下正则表达式所示,0,1重复类则指定最后一个字符可以出现0次或1次。因此,以下代码可以匹配字符串boyfrien或字符串boyfriend。/boyfriend0,1/使用小括号对匹配符进行分组的另一个好处是可以抽取匹配成功的字符串中的某些字符,例如要表示一个15位或18位数的身份证号码/d18|d15/第31页2012-6-1但是,如果要通过身份证号码的前3位来判断该身份证号码属于如个省份,就必须要使用到到以下正则表达式/(d3)(d15|d12)/在以上正则表达式中,将身份证号码分为了两组,第一组是d3,即身份证号码的前3位数字

18、。第二组是d15|d12,即前3位数字之后,再加上15位数字或12位数字。在进行分组之后,旦字符串匹配成功,就可以分别提取该字符串的前3位数字和后面的所有数字。第32页2012-6-1引用在正则表达式中,将分配符分组之后,还可以在同一个正则表达式中引用分组之后的分配符。例如,在JS中可以将使用单引号或双引号引用一个字符串,那么可以使用以下正则表达式来匹配这种字符串的引用。/*/以上正则表达式中,将字符串引用分成了三个部分。第一部份为“”,该部分指出字符串必须以单引号或双引号开头。中间部分,也就是第二部分为,该部分说明在单引号或双引号括起来的字符串中,可以使用0个或多个字符,但这些字符中不能包括

19、单引号和双引号。第三部分与第一部分相同,也是,该部份说明字符串以单引号或双引号结尾。第33页2012-6-1标志正则表达式中的标志用于说明匹配的规则。正则表达式的标志通常写在/符号之外,用于对整个正则表达式的匹配情况进行说明,例如以下正则表达式说明在匹配时不区分大小写,因此,以下正则表达可以匹配Class、class、CLASS等字符串/class/i第34页2012-6-1正则表达式对象使用正则表达式对象在String对象方法中使用正则表达式,通常使用正则表达式的直接量,其实JS中可以使用正则表达式对象来表示正则表达式。正则表达式对象,又称为RegExp对象,其构造函数的语法代码如下:Num

20、berRegExpName=new RegExp(pattern,attributes)pattern:字符串,即要匹配的正则表达式(不需要使用/)attributes:正则表达式的标志,也就是igmvar myRegExp1=new RegExp(class);var myRegExp2=new RegExp(class,i);var myRegExp3=new RegExp(class,ig);以上代码中,创建了三个RegExp对象。其中第1个RegExp对象可以匹配字符串“class”第2个RegExp对象可以匹配字符串“class”、Class等,因为该RegExp对象的匹配模式为i,

21、即不区分大小写第3个RegExp对象除了不区分大小写匹配“class”之外,还可以执行全局匹配。第35页2012-6-1也可以通过正则表达式直接量来创建RegExp对象var myRegExp1=/class/;var myRegExp1=/class/i;var myRegExp1=/class/gi;使用正则表达式替换字符串var myRegExp1=new RegExp(class,gi);var myRegExp2=/class/gi;var str=Define a Class with a class definition.;document.write(原字符串:+str+);d

22、ocument.write(替换后的字符串:+str.replace(myRegExp1,abc)+);document.write(替换后的字符串:+str.replace(myRegExp2,abc)+);第36页2012-6-1RegExp对象的方法和属性RegExp对象的方法并不多,主要用于匹配字符串或测试字符串是否匹配第37页2012-6-1第38页2012-6-1简单地匹配字符串var myRegExp=/class/i;var str=Define a Class with a class definition.;var arrExp=myRegExp.exec(str);doc

23、ument.write(原字符串:+str+);document.write(正则表达式:+myRegExp.source+);document.write(该正则表达式是否开始了g标志:+myRegExp.global+);document.write(该正则表达式是否开始了i标志:+myRegExp.ignoreCase+);document.write(匹配的子字符串:+arrExp+);document.write(该次匹配后的字符位置:+myRegexp.lastIndex+);第39页2012-6-1匹配字符串和子字符串var str=Define a Class with a c

24、lass definition.;var myRegExp1=/defin(w+)/i;var arrExp1=myRegExp1.exec(str);var myRegExp2=/definw+/i;var arrExp2=myRegExp2.exec(str);document.write(原字符串+str+);document.write(正则表达式:+myRegExp1.source+);document.write(其匹配的子字符串:+arrExp1+);document.write(正则表达式:+myRegExp2.source+);document.write(其匹配的子字符串:

25、+arrExp2+);第40页2012-6-1创建了两个不同的RegExp对象。这两个RegExp对象所使用的正则表达式:/defin(w+)/i/definw+/i从理论上讲,这两个正则表达式可以完整匹配的字符中都是相同的,即可以匹配以defin开头的,后面的可以是一个或多个字符(a-zA-Z0-9)。因此在本例中,以上两个正则表达式应该可以完整匹配的子字符串为Define和definition。由于没有使用g标志,因此在第一次成功匹配之后,就会停止匹配。因此,以上两个正则表达式的完整匹配结果为Define。但是,为什么两个正则表达式的exec()方法返回的结果不同呢?对于第一个正则表达式而

26、言。使用了()分组符将完全匹配的字符串Define中的Defin后的字符看成了一个分组。而该分组是可以被引用的,这种引用通常称为“反向引用”,而该分组中的表达式也就是正则表达式的子表达式。因此,第一个正则表达式的exec()方法返回的数组中有两个元素,而第二个正则表达式的exec()方法返回的数组中只有一个元素。第41页2012-6-1引用匹配成功的字符串var str=Define a Class with a class definition.;var myRegExp=/defin(w+)/i;var arrExp=myRegExp.exec(str);document.write(原字

27、符串:+str+);document.write(正则表达式:+myRegExp.source+);document.write(其匹配的子字符串:+arrExp+);document.write(正则表达式中第一个子表达式所匹配的子字符:+RegExp.$1+);第42页2012-6-1由于RegExp对象的exec()方法可以返回一个数组,因此,可以通过数组长度获得匹配成功的子字符串的数量,也可以使用数组下标的方法来引用匹配成功的子字符串。从上例中我们可以看出,exec()方法返回的数组元素的个数,主要取决于正则表达式及其子表达式。在正则表达式中,可以使用RegExp.$n的方式引用正则表

28、达式的子表达式所匹配成功的子字符串。例如:RegExp.$1可以引用第一个子表达式所匹配成功的子字符串,该引用相当于引用了exec()方法返因的数组的第2个元素(第1个元素是正则表达式完整匹配成功的子字符串,而不是该表达式的子表达式所匹配成功的子字符串)。RegExp.$2可以引用第二个子表达式匹配成功的子字符串,该引用相当于引用了exec()方法返回的数组的第3个元素。依次类推。第43页2012-6-1测试匹配是否成功RegExp对象的test()方法,可以用于测试一个字符串是否可以成功匹配某个正则表达式。text()方法比exec()方法要简单。regexp.test(str)其中,regexp

温馨提示

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

评论

0/150

提交评论