[转]JavaScript-正则表达式(二)
JavaScript中的正则表达式简介
摘要:对文本数据进行操作是JavaScript中常见的任务。正则表达式通过允许程序员指定字符串匹配的模式来简化诸如验证表单中输入是否具有正确格式之类的任务。给定模式以后,字符串中匹配给定正则表达式的部分就可以很容易的定位、抽取和替换,这就简化了对于象URL、电子邮件地址、电话号码以及Cookie之类的结构化数据的识别和抽取工作。使用正则表达式可以按照确定的格式对任何形式的字符串数据进行操作。本文对javascript中的正则表达式进行了较为详细的介绍,并结合实际给出一些例子。最后给出一个包含常用验证需求的测试页面。
关键词:正则表达式(regexp)
1JavaScript正则表达式:
正则表达式(regexp)是在JavaScript1.2和JavaScript3.0中和RegExp对象一起引入的,因此它们的大部分功能都可以通过RegExp的方法获得。然而,String对象的很多方法也把正则表达式作为参数,因此在两种环境下正则表达式都经常使用。
1.1正则表达式的字面语法格式:
一个正则表达式的格式如下:
/由字符、字符类、特殊字符类、分组符、位置指示符、转义码、重复计量器、可选量符号组成的字符串/正则表达式标记
如:/^(http)[1-3]{2,4}/d/w$/ig
1.2正则表达式标记:
字符含义举例i大小写不敏感对于模式/http/i"http"和"HttP"一样可以匹配g全局匹配。找出全部匹配字符串,而不仅仅是找到第一个就返回。常用于替换m多行匹配1.3正则表达式位置指示符:规定模式在它所匹配的字符串里的位置。
字符含义举例^开头对于/^http/只匹配以http开头的字符串$结束对于/http$/只匹配以http结尾的字符串可以同时使用这两个位置指示符来确保精确的匹配给定的模式,如:/^http$/将只匹配http。
1.4转义码:
代码含义/f换页/n换行/r回车/t水平制表符/v垂直制表符//正斜杠//反斜杠/OOO八进制值OOO代表的ASCII字符/xHH十六进制HH代表的ASCII字符/uHHHH十六进制HHHH代表的Unicode字符/cX由^X代表的控制字符,如:/cH代表Ctrl+H/各种标点符号、运算符号、括弧等各种标点符号、运算符号、括弧等用在正则表达式中的转义码是用在字符串中的转义码的超集(在正则表达式中有很多带特殊含义的字符如^和$等)。
1.5正则表达式的重复计量器:指定某个字符或字符组合可以或者必须出现的次数。
字符含义举例*匹配前面的字符或字符组合0或者多次/5*/+匹配前面的字符或字符组合1或者多次/b+/?匹配前面的字符或字符组合0或者1次/e?/{m,n}匹配前面的字符或字符组合最少m次,最多n次/r{1,4}/{m,}匹配前面的字符或字符组合m次或者更多次/b{4,}/{m}匹配前面的字符或字符组合m次/a{5}/1.6分组符"()":在使用重复计量器时可以将字符用()组合起来作为一个项目
如:/a(34)+c/匹配任何含有一个a跟随一个或者多个"34"再紧跟一个c的字符串。
1.7字符类:
可以使用[]指定一个有效的字符集合
如:/[123]/匹配任何含有1、2、3数字的字符串。
在[]中可以使用减号"-"符指定取值范围
如:/[0-9a-z]/匹配任何含有数字和小写字母的字符串
在[]中还可以使用"^"来指定不能出现的字符类
如:/[^a-zA-Z]/将匹配任何一个至少含有一个非字母字符的字符串
1.8其他特殊字符类:
代码含义[chars]匹配方括弧里任何一个字符[^chars]匹配不在括弧里任何一个字符.匹配除换行符以外的任何字符/w任何单字字符,等同/[^a-zA-Z0-9]//W任何非单字字符,等同/[a-zA-Z0-9]//s任何空格字符,等同/[/t/n/r/f/v]//S任何非空格字符,等同/[^/t/n/r/f/v]//d任何数字字符,等同/[0-9]//D任何非数字字符,等同/[^0-9]//b任何单字分界。在/w和/W之间的"空格"/B任何单字分界。在单字字符之间的"空格"[/b]任何退格字符1.9子表达式:正则表达式可以用"()"分组,用于RegExp对象自身来访问子表达式成分
如:varpattern=/(/w+)([/d-]+)/;
varcustomer="Alan555-2334";
pattern.test(customer);
alert("$1="+RegExp.$1+"/n$2="+RegExp.$2);
会显示:
"$1=Alan"
"$2=555-2334"
注意:根据ECMA的规定,可以访问的子表达式不止9个,还可以用$10,$11……,一直达到99个之多,这主要取决于浏览器是否支持。
1.10可选量符号"|":可以使用"|"来指示几个条目的逻辑"或"关系
如:/^(http|ftp|https)/可以匹配以"http"、"ftp"或"https"开头的字符串。
/abc|(xyz){3}/匹配包含有"abc"或者"xyzxyzxyz"的字符串
一些常用正则表达式的例子:
//d{1,3}/./d{1,3}/./d{1,3}/./d{1,3}/匹配如125.0.0.2之类的ip地址
/^(http|ftp|https):////.*/匹配诸如http://jdskfk之类的url地址
//w+@/w+/./w{1,3}/匹配诸如[email protected]之类的email地址{1,3}表示后缀只可能是cn.,gov,com,org之类的域名后缀
2RegExp对象
2.1构造正则表达式的两种方法:
1、varpattern=/dsfdsf/i
2、varpattern=newRegExp("dsfdsf","i")
3、
2.2RegExp对象的方法:
1、Test("sjdalkfjlsd")-------返回tr或者false
2、Compile("","")-----------用新的正则表达式替代旧的正则表达式:不常用.
3、Exec("dsafsda")----------返回带有很多属性的数组:包括该数组的长度length;显示输入的原始字符串input;保存第一次匹配的索引的index;以及保存第一次匹配以后接下来的搜索开始处字符所对应的索引lastIndex。(从0开始计数)。例如:
varpattern=/cat/;
varresult=pattern.exec("heisabigcat,afatjdfjlkdj");
则result="cat";result.length=1;result.index=12;result.lastIndex=15;
result.input="heisabigcat,afatjdfjlkdj"
如果不能匹配,则result=null;
如果使用了子表达式,则返回的数组元素将不止一个。
如:
varpattern=/(cat)(and)(dog)/
varresult=pattern.exec("mycatanddogareblack.")
则result=catanddog,cat,and,dog
result.length=4;result.index=3;result.lastIndex=15;
result.input=mycatanddogareblack.
注意:exec()方法将整个匹配的字符串放到返回数组的第一个元素,lastIndex属性指向最后一个匹配的字符串的最后一个字符的下一个位置。此外,exec()方法在执行全局匹配的时候只返回第一个匹配,所有,需要返回多个匹配的时候,最好使用后面所要介绍的String的match()方法.
2.3RegExp对象的实例属性(必须通过真实存在的对象调用)
属性值实例globle指明全局标记"g"是否设置。只读Varpattern=/(cat)(dog)/gPattern.test("dsf")则pattern.globle=tr;igoreCase指明"i"是否设置。只读Varpattern=/(cat)(dog)/gPattern.test("dsf")则pattern.igoreCase=false;lastIndex指明下一个匹配的位置,可设置Varpattern=/(cat)(dog)/gPattern.test("thisisacatdogandcatdog")则pattern.globle=17;multilane指明"m"是否设置,只读Varpattern=/(cat)(dog)/gPattern.test("dsf")则pattern.multilane=false;so?表示该正则表达式的字符形式,只读Varpattern=/(cat)(dog)/gPattern.test("dsf")则pattern.so?=(cat)(dog);2.4RegExp对象的静态属性(全局变量)(不必通过对象调用)
属性替代形式值实例$1,$2,…$9无字符串含有最近匹配的前9个括号内的子表达式的文本Varpattern=/(cat)(dog)/gPattern.test("thisisacatdogandcatdog")则:RegExp.$1=catRegExp.$2=dogIndex无Input$_LastIndex无LastMatch$&LastParen$+LeftContext$'Varpattern=/(cat)(dog)/gPattern.test("thisisacatdogandcatdog")则:RegExp.LeftContext="thisisa"rightContext$'Varpattern=/(cat)(dog)/gPattern.test("thisisacatdogandcatdog")则:RegExp.rightContext="andcatdog"3正则表达式的Stirng方法
3.1search():返回第一个匹配的子字符串开始字符的索引或者-1(没有找到任何匹配)
如:"javascriptregularexpressionsarepowerful!".search(/pow.*/i)=35;
而:"javascriptregularexpressionsarepowerful!".search(//d/i)=-1;
3.2split():将字符串分成子字符串,并以数组的形式返回
如:varstring="10/3//4/7/9";varsplitExp=/[//]+/;myArray=string.split(splitExp);
则myArray[0]="10";myArray[1]="3";……;myArray[4]="9";
3.3replace():返回字符串,用第二个参数替换匹配第一个参数(一个正则表达式)的文本所得到的结果。可以指定是否全局匹配。
如:s="hello.regexpsarefun.".replace(//./g,"!")将返回"hello!regexpsarefun!".
可用该方法实现自己的Trim方法,如:
functionTrim(inputStr){returninputStr.replace(/(^/s*)|(/s*$)/g,"");}
3.4match()方法:使用一个正则表达式为为参数,返回包含了匹配结果的数组。
如:varpattern=//d{2}/g;varn="22,33,33,33";varresult=n.match(pattren);
则result[0]="22";result[1..3]="33";
4高级正则表达式:
4.1/^.*$/gm:可以将一段多段落文字按换行符分解到几个字符串里。
如:vartext="thisisamultiplanelines/nthisisa2ndlines/nthisisa3thlines"
varlines=text.match("/^.*$/gm");则
lines[0]="thisisamultiplanelines";
lines[1]="thisisa2ndlines";
lines[2]="thisisa3thlines";
4.2(?:):规定加括号内的子表达式不能被捕获。
如:varpattern=/(?:abc)(def)/
vartext="abcdef".replace(pattern,"ksdkfj:$1")将返回:"ksdkfj:def";
如果pattern=/(abc)(def)/则返回:"ksdkfj:abc"。
4.3(?=):规定只有在某条目后面紧跟着包含在(?=)中的表达式时,才会对前面的条目匹配。
如:varpattern=//d(?=/./d+)/匹配"3.3"、"3.14",但不匹配"3"或"3."。
4.4(?!):与(?=)正好相反。
如:varpattern=//d(?!/./d+)/匹配"3"但不匹配"3.3","3.14"
5正则表达式的局限性:
1、匹配要求的复杂性使得不可能满足任意想要的匹配模式;
2、只能对语法而不能对语义的有效性进行验证。例如:025-1234567是合法的电话号码,但不一定是实际存在的电话号码。
6附录:
test.html和ok.jsp:如果在test.html中输入都正确,则转向ok.jsp显示通过验证提示信息
参考文献
[1][美]ThomasPowell,FritzSchneider著牛力等译,《JavaScript完全手册》,电子工业出版社,2002.7
[2][美]DannyGoodman著李真文译,《JavaScript宝典》,电子工业出版,2002.1
[3]www.csdn.net专家门诊->Web开发->JavaScript版
文章来源:http://rangyang163.blog.163.com/blog/static/377437582007624113134627/