博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Regular expression
阅读量:6632 次
发布时间:2019-06-25

本文共 12758 字,大约阅读时间需要 42 分钟。

Regular expression 用RegExp类表示正则表达式.正则表达式主要用来验证客户端的输入.填写完以后,发送给服务器.正则表达式:匹配和文本检索替换的函数.一,创建正则表达式,提供了2种方法.new和字面量(1)new 方式创建var box = new RegExp('box');    //box 是必须填入的字符串参数.document.write(box + "
"); //打印出 /box/ //也是正则的边界var box = new RegExp('box', 'igm'); //第二个参数是模式修饰符document.write(box + "
");模式修饰符: i 代表忽略大小写g 全局作用域 m 多行匹配(2)字面量方式创建var box = /box/; //使用字面量方式的正则alert(box);//如果想加入修饰符的话,直接加入就可以var box = /box/igm;alert(box);二,匹配正则表达式pattern用test和exec方法来匹配RegExp 对象的方法方法 功能test 在字符串中测试模式匹配,返回true 或falseexec 在字符串中执行匹配搜索,返回结果数组.例子(1)使用new运算符的test正则表达式var patten = new RegExp('Box');var str = 'box';alert(patten.test(str)); //false 区分大小写var patten = new RegExp('Box', 'i');var str = 'box';alert(patten.test(str)); //true 忽略大小写(2)使用字面量方式test的正则表达式var box = /box/;var str = 'box';alert(box.test(str));(3)使用一条语句实现正则表达式 pattern.test(str)alert(/box/img.test("this is a Box, that is a pox!"));(4)使用exec来检测var pattern = /box/img;var str = 'this is a box,and that is a Box.';alert(pattern.exec(str)); //boxalert(typeof pattern.exec(str)); 三,使用字符串的正则表达式的方法除了test和exec方法,String对象也提供了四个使用正则表达是的方法.(1)match(pattern) 返回pattern中的子串或null.(2)replace(pattern, replacement) 用replacement替换pattern(3)Seach(pattern) 返回字符串中的pattern开始位置(4)Split(pattern) 返回字符串指定pattern拆分的数组例子:(1)使用match 方法获取获取匹配数组var pattern =/box/ig; //忽略大小写并且全局搜素var str ='this is a box! that is a box.';alert(str.match(pattern)); //box,boxalert(str.match(pattern).length); //数组长度是2(2)使用search进行查找var pattern =/box/ig;var str ='this is a box! that is a box.';alert(str.search(pattern)); //10由于search方法查找的就返回,所以不存在全局g这个模式的概念.var pattern =/xxxx/ig;var str ='this is a box! that is a box.';alert(str.search(pattern)); //找不到返回-1(3)使用replace替换var pattern = /box/i;var str = 'this is a box, that is a box too';alert(str.replace(pattern, 'tom')); 由于不是全局的,所以this is a tom, that is a box too.var pattern = /box/ig;var str = 'this is a box, that is a box too';alert(str.replace(pattern, 'tom'));全局的,所以this is a tom, that is a tom too.(5)使用split差分字符串成数组var pattern = / /ig;var str = 'this is a box, that is a box too';document.write(str.split(pattern)); //长度是9个输出 this, is, a, box,, that, is, a, box, too四,正则表达式的静态属性和实例属性静态表达式直接调用,无需声明,而实例属性需创建正则表达式.属性 短名 含义input $_ 当前被匹配的字符串lastMatch $& 最后一个匹配字符串lastParen $+ 最后一对圆括号内的匹配子串leftContext $` 最后一次匹配前的子串multiline $* 用于指定是否所有的表达式都用于多行的布尔值rightContext $' 在上次匹配之后的子串var pattern = /(g)oogle/;var str = 'This is google!';pattern.test(str); //执行一下alert(RegExp.input); //This is google!alert(RegExp.leftContext); //This isalert(RegExp.rightContext); //!alert(RegExp.lastMatch); //googlealert(RegExp.lastParen); //galert(RegExp.multiline); //falsePS:Opera 不支持input、lastMatch、lastParen 和multiline 属性。IE 不支持multiline 属性。导致就不用了.RegExp对象的实例属性属性 含义global Boolean 值,表示g 是否已设置ignoreCase Boolean 值,表示i 是否已设置lastIndex 整数,代表下次匹配将从哪里字符位置开始multiline Boolean 值,表示m 是否已设置Source 正则表达式的源字符串形式PS:以上基本没什么用。并且lastIndex 在获取下次匹配位置上IE 和其他浏览器有偏差,主要表现在非全局匹配上。lastIndex 还支持手动设置,直接赋值操作。五.获取控制正则表达是的元字符是包含特殊含义的字符,它们会有一些特殊的功能,可以控制匹配的模式的方式.反斜杠后的元字符将失去其特殊意义.(1)字符类:单个字符和数字元字符/元符号 匹配情况. 匹配出换行符意外的任意字符[a-z0-9] 匹配括号中的字符集中的任意字符[^a-z0-9] 匹配任意不在括号中的字符集中的字符\d 匹配数字\D 匹配非数字,同[^0-9]相同\w 匹配字母和数字及_\W 匹配非字母和数字及_\d 匹配0-9之间的数字\D 匹配非0-9之间的数字 类似[^0-9](2)字符类:重复字符元字符/元符号 匹配情况x? 匹配0 个或1 个xx* 匹配0 个或任意多个xx+ 匹配至少一个x(xyz)+ 匹配至少一个(xyz)x{m,n} 匹配最少m 个、最多n 个x(3)字符类:空白字符元字符/元符 号匹配情况\0 匹配null 字符\b 匹配空格字符\f 匹配进纸字符\n 匹配换行符\r 匹配回车字符\t 匹配制表符\s 匹配空白字符、空格、制表符和换行符\S 匹配非空白字符(4)字符类:替代字符元字符/元符 号匹配情况this|where|logo 匹配this 或where 或logo 中任意一个(5)字符类:记录字符元字符/元符 号匹配情况(string) 用于反向引用的分组\1 或$1 匹配第一个分组中的内容\2 或$2 匹配第二个分组中的内容\3 或$3 匹配第三个分组中的内容例子:(1)点可以代替除换行符意外的任意字符.var pattern = /g..gle/ig;var str = 'this is a g0agle';alert(pattern.test(str)); //true如果没有字符,或者为\n就是错误的.var pattern = /g..gle/ig;var str = 'this is a g\nagle'; //有换行符alert(pattern.test(str)); //falsevar pattern = /g..gle/ig;var str = 'this is a gagle'; //缺少一个字符alert(pattern.test(str)); //falsevar pattern = /g..gle/ig;var str = 'this is a ga00gle'; //多了一个alert(pattern.test(str)); //false(2)重复匹配 * 匹配0个或者多个var pattern = /go*gle/ig; //o* 代表 匹配0个或多个o.var str = 'this is a ggle'; //0个是可以的alert(pattern.test(str)); //true(3)重复匹配 + 匹配至少一个或者多个var pattern = /go+gle/ig; //匹配至少1个或者多个ovar str = 'this is a ggle'; alert(pattern.test(str)); //false,因为没有ovar pattern = /go+gle/ig;var str = 'this is a google'; //有2个,可以alert(pattern.test(str)); //true(4)匹配一个或者0个 ? 问号var pattern = /go?gle/ig;var str = 'this is a google'; //2个o就错了alert(pattern.test(str)); //falsevar pattern = /go?gle/ig;var str = 'this is a gogle'; //一个o是对的alert(pattern.test(str)); //truevar pattern = /go?gle/ig;var str = 'this is a ggle'; //没有也可以alert(pattern.test(str)); //true组合:例如: .? 代表任意字符,一个或者0个(5)区间 x{m, n} 匹配最少m 个、最多n 个xvar pattern = /go{2,4}gle/ig; //匹配2到4个ovar str = 'this is a google'; //2个oalert(pattern.test(str)); //true绝对限定几次 比如 {2} 2次{3,} 表示3或者3个以上(6)字符类匹配[a-z] 表示26个小写字母都匹配var pattern = /go[a-z]gle/ig;var str = 'this is a google'; //o属于[a-z]alert(pattern.test(str)); //truevar pattern = /go[a-z]gle/ig;var str = 'this is a go1gle'; //1不属于[a-z]alert(pattern.test(str)); //false[A-Z] 大写的A到Z[0-9] 0到9例如: [0-9]* 代表0次1次,或者多次的0-9的数字var pattern = /go[a-z]*gle/ig; var str = 'this is a godfdsfdsgle'; //有很多次字符属于a-zalert(pattern.test(str));[^a-z] ^符号就是取反,匹配不在括号里面的任意字符var pattern = /go[^a-z]gle/ig;var str = 'this is a go1gle'; //1不是a-zalert(pattern.test(str)); //true(7)锚元素匹配^ 行首匹配$ 行尾匹配var pattern = /^[0-9]oogle/ig;var str = '9oogle';alert(pattern.test(str)); //true注意:这是一个在中括号[],外面添加的^,表示从行首匹配,放在里面是取反.var pattern = /^[0-9]oogle/ig;var str = '39oogle';alert(pattern.test(str)); //false这是因为,需要从头开始匹配,第二字符不是o,就返回错误.var pattern = /[\W]oogle$/ig; //结尾必须是[\W]ooglevar str = '!oogle is good';alert(pattern.test(str)); //false(8)\w 字母数字和下划线var pattern = /[\w]oogle/ig;var str = '_oogle';alert(pattern.test(str)); //true注意:只是下划线,除此之外都不是,比如点(.)或则斜杠等.\W 除了字符数字和下划线以外的字符var pattern = /[\W]oogle/ig;var str = '!oogle'; //!不是字母,也不是数字和下划线alert(pattern.test(str)); //true(9)\s 匹配空白字符、空格、制表符和换行符, (一个空格)var parrent = /go\sgle/ig;var str = 'go gle'; //一个空格alert(parrent.test(str)); //truevar parrent = /go\sgle/ig;var str = 'go gle'; //2个空格alert(parrent.test(str)); //false(10)\b 表示到达边界或者空格var parrent = /g\sogle\b/ig;var str = 'g ogle'; //e在边界alert(parrent.test(str)); //truevar parrent = /g\sogle\b/ig;var str = 'g ogle is not do'; //g ogle在边界.空格.alert(parrent.test(str));(11) | 是或,选择模式.var parrent = /google|baidu|bing/; //匹配三种模式var str = 'www.baidu.com';alert(parrent.test(str)); //truevar str1 = 'www.bing.com';alert(parrent.test(str1)); //true(12)分组匹配 用括号括起来,代表一个字符 ()var parrent = /google{4,8}$/img;var str = 'this is a google'; alert(parrent.test(str)); //false错误的原因是要匹配e字母的4到8次,才可以.因为$限定了结尾.var parrent = /(google){4,8}/img;var str = 'this is a google';alert(parrent.test(str)); //false 错误的原因是分组之后,google代表一个字符,要4到8次google才可以.var parrent = /goog(le){4,8}/img;var str = 'this is a googlelelele';alert(parrent.test(str)); //truevar parrent = /goog(le){4,8}/img;var str = 'this is a googlelelele';parrent.test(str);alert(RegExp.$1); //le注意:RegExp.$1表示获取模式中第一个分组对应的匹配字符串var parrent = /goog(le){4,8}/img;var str = 'this is a googlelelele';document.write(str.replace(parrent, '$1')); //this is a le$1表示匹配的第一个分组的内容,给html加粗.var parrent = /(.*)\s(.*)/img;var str = 'baidu google';document.write(str + "
"); //baidu googledocument.write(str.replace(parrent, '$2 $1'));//google baidu这段正则将分组$1和分组$2进行了交换.贪婪 惰性+ +?? ??* *?{n} {n}?{n,} {n,}?{n,m} {n,m}?(13)贪婪var parrent = /[a-z]/img;var str = 'baidu google';document.write(str.replace(parrent, '1')); //11111 111111这是常规替换,将每一个符合规则的字符都替换为1var parrent = /[a-z]+/img;var str = 'baidu google';document.write(str.replace(parrent, '1')); //1 1这里是贪婪,将符合规则的字符串全替换为1个1.var parrent = /[a-z]+?/;var str = 'baidu google';document.write(str.replace(parrent, '1')); //1aidu google这个是惰性模式,但是开启全局的模式,那么即使开启惰性模式,也要都全是1var parrent = /8(.*)8/;var str = '8google8 8google8 8google8';document.write(str.replace(parrent, '$1'));//结果是google8 8google8 8google开启了懒惰模式var parrent = /8(.*?)8/;var str = '8google8 8google8 8google8';document.write(str.replace(parrent, '$1'));//结果是google 8google8 8google8,只有第一个被匹配了.var parrent = /8(.*?)8/g;var str = '8google8 8google8 8google8';document.write(str.replace(parrent, '$1'));//结果是 google google google(14) exec 返回数组var pattern = /^[a-z]+/;var str = 'google 2012';alert(pattern.exec(str)); //googlevar pattern = /^[a-z]+\s[0-9]{4}$/;var str = 'google 2012';alert(pattern.exec(str)); //google2012var pattern = /^([a-z]+)\s([0-9]{4})$/;var str = 'google 2012';document.write(pattern.exec(str)); //google 2012, google, 2012//array[0]是整个字符串//array[1]是第一个分组的字符串google//array[2]是返回分组的第二个字符串:2012.(15)捕获性分组,就是所有的分组都返回var pattern = /^(\d+)([a-z])/;var str = '123abc';document.write(pattern.exec(str)); //123a,123,a//a[0] 123a//a[1] 123//a[2] a(16)非捕获性分组,只要在不需要捕获返回的分组前加上 ?: 就不会返回var pattern = /^(\d+)(?:[a-z])/; //a就没有返回var str = '123abc';document.write(pattern.exec(str)); //123a, 123var pattern = /(a?(b?(c?)))/;var str = 'abc';document.write(pattern.exec(str)); //第一步 a[0], 整个匹配到的字符串abc//第二步 a[1], 匹配第一个分组 (a?(b?(c?))), abc//第三步 a[2], 匹配第二个分组 (b?(c?)), bc//第四步 a[3], 匹配第三个分组 (c?), c(17)前瞻捕获(特定捕获,后面接着特定的字符)var pattern = /goo(?=gle)/; //goo后面必须跟着gle才可以var str = 'google';alert(pattern.exec(str)); //返回goo,而不是googlevar pattern = /goo(?=gle)/; //goo后面必须跟着gle才可以var str = 'googge';alert(pattern.exec(str)); //返回 null(18)使用特殊字符进行捕获,用反斜杠转义,才可以匹配var pattern = /\/\?/; // / 和 ? 都转义了.var str = '12//3d/?.!ef';alert(pattern.exec(str)); (19)换行模式var pattern = /\d+/ig;var str = '121331\n324234\n3d323432ef';alert(str.replace(pattern, '#')); //都替换了如果限定首部,那么必须开启换行模式---mvar pattern = /^\d+/igm;var str = '121331\n324234\n3d323432ef';alert(str.replace(pattern, '#'));五,常用的正则表达式1.检查邮政编码 规则:6位,并且第一位不为0var pattern = /[1-9][0-9]{5}/;var post = 123124;alert(pattern.test(post));2.文件压缩包 股则:后缀名zip rar.gz,文件名是字母数字下划线var str = '2-z.zip';var pattren = /^[\w\-]+\.zip|rar|gz/;alert(str.match(pattren));3.删除多余空格var str = 'this is a boy, that is a girl.';var pattern = /\s/img;alert(str.replace(pattern, ''));4.删除首尾空格var pattern = /^\s+/; //强制首var str = ' goo gle ';var result = str.replace(pattern, '');pattern = /\s+$/; //强制尾result = result.replace(pattern, '');alert('|' + result + '|');var pattern = /^\s*(.+?)\s*$/; //使用了非贪婪捕获var str = ' google ';alert('|' + pattern.exec(str)[1] + '|');var pattern = /^\s*(.+?)\s*$/;var str = ' google ';alert('|' + str.replace(pattern, '$1') + '|'); //使用了分组获取5.简单的电子邮件验证var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;var str = 'yc60.com@gmail.com';alert(pattern.test(str));var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;var str = 'yc60.com@gmail.com';alert(pattern.test(str));

 

转载于:https://www.cnblogs.com/hgonlywj/p/4842610.html

你可能感兴趣的文章