第1页2012-6-1正则表达式第2页2012-6-1字符串对象在JS中字符串型是一个基本的数据类型,而字符串对象(StringObject)可以将字符串打包成一个对象。将字符串打包成对象之后,就可以调用字符串对象中的方法。在JS中,可以隐藏地将一个字符串转换为字符串对象。因此,字符串对象中的方法和属性可以由字符串直接引用,而不需要先将字符串转换成字符串对象。第3页2012-6-1字符串对象的构造函数StringObjectName=newString(value);variableName=String(value);当使用new运算符时,String()作为构造函数使用。此时可以将value参数转换成一个字符串,并返回一个包含该字符串的字符串对象,此时StringObjectName是一个对象名。在没有使用new运算符时,String()只是作为一个函数使用。该函数的作用是将value参数转换成一个字符串并将字符串返回。第4页2012-6-1第5页2012-6-1第6页2012-6-1搜索子字符串在字符对象中,提供了很多返回字符串的子字符串的方法,这些方法可以满足多种不同的搜索子字符串的需要。字符串对象中返回子字符串的方法有:charAt()slice();substr();substring();scriptvarstr=这是一个字符串;//返回第三个字符document.write(str.charAt(2)+br);//返回第五个字符document.write(str.charAt(5)+br);document.write(str.charAt(20)+br);/script第7页2012-6-1substr()方法的使用brscriptvarstr=这是一个字符串;//返回从第3个字符开始,长度为3的子字符串document.write(str.substr(2,3)+br);//返回从倒数第5个字符开始,长度为3的子字符串document.write(str.substr(-5,3)+br);/script第8页2012-6-1substring()方法的使用scriptvarstr=这是一个字符串;//返回第3个字符到第5个字符之间的子字符串document.write(str.substring(2,5)+br);//以下语句就返回空字符串document.write(str.substring(5,5)+br);//从第3个到最后一个字符之间的子字符串document.write(str.substring(2)+br);/script第9页2012-6-1indexOf()方法和lastIndexOf()的使用brscriptvarstr=Defineaclasswithaclassdefinition.;//第1次出现class的位置document.write(str.indexOf(class)+br);//从第11个字符开始,第1次出现classdocument.write(str.indexOf(class,10)+br);//第1次出现classes的位置document.write(str.indexOf(classes)+br);//最后1次出现class的位置document.write(str.lastIndexOf(class)+br);//从第11个字符开始向前搜索,最后1次出现class的位置document.write(str.lastIndexOf(class,10)+br);/script第10页2012-6-1replace()方法的使用scriptvaroldstr=Defineaclasswithaclassdefinition.;document.write(oldstr,br);//替换子字符串varnewstr=oldstr.replace(class,abc);//显示结果document.write(newstr,br);/script第11页2012-6-1转换大小写script//原始字符串varoldstr=DefineaclasswithaClassdefinition;//转换为大写document.write(oldstr.toUpperCase());//转换为小写document.write(oldstr.toLowerCase());/script第12页2012-6-1正则表达式正则表达式简介正则表达式主要作用是用来匹配字符串。由于其简单并且功能强大,因此正则表达式不仅仅可以在JS中使用,众多高级语言(如java、asp.net等)都加入了正则表达式的支持。第13页2012-6-1正则表达式的作用前面介绍过的表单验证方法很简单。例如,可以使用String对象的length属性是否为0来判断用户是否在文本框中输入了文字,或者判断用户输入文字的长度是否达到要求。假设表单中有一个要求输入身体号码文本框,目前的身份证号码长度有两种,分别为15位和18位的。那么可以通过以下代码来判断用户输入身份证号码长度是否正确。if(myForm.myText.value.lenght==15||myForm.myText.value.lenght==18)如果用户输入的身份证号码并不是数字,而是字母的话,使用以上方法就不能正确判断了。而使用正则表达式,就可以很方便地判断用户输入身份证号码格式是否正确。正则表达式除了可以验证数据的效性之外,还常用来搜索、替换文本,或者从文本中提取了字符串。第14页2012-6-1正则表达式的工作原理正则表达式的工作原理比较简单,使用的是通配符匹配技术。通配符在计算机中应用比较多的是查找文件。当要查找一个文件而记不清文件时,通常就使用通配符的方式来查找。第15页2012-6-1正则表达式的语法正则表达式是由普通字符和一些无字符组成的文字模式。其中普通字符就是在程序里常用到的字符,如字母、数字等。无字符是一些有特别是一些有特别含义的特殊符号,这些元字符可以在查找文本时匹配一个或多个字符串。将普通字符和元字符放在一对斜框(/)中就可以创建一个正则表达式的直接量。可以将正则表达式看成是一个模板,使用该模型可以匹配多个文本。第16页2012-6-1字符与字符串在正则表达式中,一种最简单的匹配方法就是字符与自身的匹配。例如:正则表达式/a/匹配字符a、正则表达式/b/匹配字符b。数字也可以进行这样的匹配,例:正则表达式/1/匹配数字1。除了单个字符之外,字符串也可以与其自身匹配。例如:正则表达式/abc/匹配字符串abc等。但是在正则表达式中,有很多字符是具有特殊含义的字符,如*?可以用来匹配多个字符和一个字符,这些字符就不能用于匹配其自身。对于这些符号,就必胜使用反斜扛(\)来进行匹配。如正则表达式/\*/可以匹配字符*,正则表达式/\(/可以匹配字符(。在正则表达式中,这些特殊的符号如下所示:!$^*+=|.?\/()[]{}第17页2012-6-1第18页2012-6-1第19页2012-6-1例:以下三行正则表达式可以分别匹配字符串“abc”、abc.txt和What'syourname?。/abc//abc\.txt//What'syourname\?/第20页2012-6-1字符类正则表达式中的字符类可以代表一系列的字符。一个字符类可以与其所包含的任何字符相匹配。创建字符类的方式很简单,只要将要匹配的字符放入方括号中即可。例如:正则表达式“/[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在字符类中,可以使用^来代表排除性的匹配,^类似于非,即不包括在方括号中字符之外的所有字符,如以下两行正则表达式所示。以下正则表达式中,第一行正则表达式可以匹配除小写字母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行正则表达式中可以匹配“第10章”到第99章几个字符串。/第[1-9]章//第[1-9][0-9]章//第[1-9]\d章/第24页2012-6-1重复类字符与字符类都只能匹配单个字符,例如正则表达式/\d/可以匹配数字0-9,如果要匹配一个两位数,就必须使用两次\d也就是正则表达式/\d\d/。如果要匹配一个四位数,那就要使用/\d\d\d\d/如果要匹配一个18位的身份证号码,那就要使用18次“\d”。为了解决以上问题,在正则表达式中提供了重复类,使用重复类可以指定字符要重复的次数。最常见的重复类为?和*,其中*代表可以匹配前一个字符0次或多次。例如/ad*/可以匹配a、ab、add等字符。而?可以匹配前一个字符0次或1次。例如/ad?/可以匹配a,ad但不能匹配add。使用*或?重复类所匹配的方式十分有限,因此,正则表达式中添加了一些其他的重复类。第25页2012-6-1第26页2012-6-1使用重复类可以匹配最多的字符串。例如,一本书中的章节数不确定,如果不使用重复类,那么就无法匹配所有的单节,以下正则表达式就可以匹配所有不确定的单节。在该正则表达式中,\d*代表数字0-9可以出现0次或多次。那么无论一本书中的单节数是多少,该正则表达式都能与其匹配。/第[1-9]\d*章/第27页2012-6-1选择符正则表达式的选择符为|,该选择符用于分隔可以用来选择的文字。如以下正则表达式可以匹配字符串index、default或list。/index|default|list/需要注意的是,正则表达式选择符的匹配方式为从左至右,一旦发现有可以匹配的字符串则会停止匹配。例如,以上正则表达式将会匹配以下字符串的index,而不会匹配default。通常一个网站的首页为index.html或defalult.html第28页2012-6-1定位符前面介绍的正则表达式都可以在全文中进行搜索。例如,使用以下正则表达式可以匹配文章中所有单节的标题(如第1章)。但是,在文章的正文中也有可能引用了章节名(如“正如第1章中所述”),此时以下正则表达式并不能识别出匹配的文字是文章的标题,还是章节的正文。/第[1-9]\d*章/仔细我们会发现文章的标题可以发现,通常文章的标题都会单独占有一行。在正则表达式中,提供了^和$两个定位符。其中^定位符可以匹配一行的开始,$定位符可以匹配一行的结尾。由于文章中的标题通常都是独占一行,所以要匹配文章中的所有标题,可以使用以下正则表达式。/^第[1-9]\d*章/第29页2012-6-1第30页2012-6-1分组正则表达式中,使用小括号可以对匹配符进行分组。将匹配符进行分组之后,可以像一个独立的字符那样进行重复类的操作。例如,以下正则表达式可以匹配字符串“boy”或boyfriend。/boy(frined){0,1}/在以下正则表达式中的friend字符串加上了小括号,因此可以将整个friend字符串当成一个字符,再使用{0,1}重复类指定该字符串可以出现