正则入门 Posted on 2014-05-17 | In js入门 | 就是按照教程学一下基本概念, 自己的理解很少 ,看这架势正则一篇文章不够 还得再弄点儿文章学习学习稍微高级一点儿的… 112345678910111213141516171819202122232425262728293031323334/** * 博文作者:ruantao1989@gmail.com * 出自博客:ruantao.duapp.com/blog *///一: 创建正则对象 var regObj = /regExption/; var regObj1 = new RegExp("regExption"); //二: 执行函数 //1.exec 成功返回数组, 失败返回null var result = regObj.exec("someTestStr"); //如有结果, 则结果中带有一些信息 if( result ){ console.log("检测字串==>" + result.input + "_匹配位置==>" +result.index ); for (i = 0; i < result.length; i++) { console.log('result[' + i + ']:' + result[i]); } } //2.test 仅返回true false regObj.test("someTestStr"); //3.match, match是字串的正则方法 ,返回字串:结果1,结果2.... "someTestStr".match(regObj); //三: 量词 //连续个数 {n}表示匹配多个连续内容 /c{n}/则会匹配n个连续的字母"c" /c{3,4}/的意思是,连续的3个c或者4个字母"c"。 /c{1,}/表示1个以上的c,最多则不限个数。 //预定义字符 //*表示0次或者多次,等同于{0,}, 即c*和c{0,}等效 //+表示一次或者多次,等同于{1,} //?表示0次或者1次,等同于{0,1} 212345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970//四:贪婪模式 /c{2,4}/.exec('ccccTest')//["cccc"] ==>而不是3个c, 原因是默认会匹配尽量多的内容 //非贪婪模式 //正则末尾加?,可会匹配尽量少的内容 /c{2,4}?/.exec('ccccTest')//["cc"] //五. 元字符 //"^"开头,"$"结尾 //^c 表示以c开头 , c$ 表示以c结尾 //"."除了换行符\n之外的所有字符 /./.exec("ruantao.duapp.com");//["r"] 匹配==>第一个字母就是"非\n"的字符 /.d/.exec("ruantao.duapp.com");//[".d"] 匹配==>任意"非\n"后边紧跟字母d, d之前的"."也可以被匹配 /.+/.exec("ruantao.duapp.com");//["ruantao.duapp.com"] 匹配==>因为要匹配:任意多个"非\n" //或 // "|" 表示左右两边任意一个,都可以匹配 /^k|r.+/.exec("ruantao.duapp.com");//["ruantao.duapp.com"] 匹配==>1.k的,2.或是r开头任意个"非\n"的 /^k|r.+/.exec("kruantao.duapp.com");//["k"] //括号 //括号里是子正则, //exec后, 子正则所匹配的内容会出现在结果数组[0]之后,从[1]按个数顺延 /^(k|r).+/.exec("kruantao.duapp.com");//["kruantao.duapp.com","k"] 匹配==>k或r开头,后边任意个"非\n"字符. 数组[1]是由于子正则产生的 //集合 //中括号[]中的表达式, 作为一个整体 //[xyzr]表示x或y或z或r中的任意一个字符 /^[xyzr]/.exec("ruantao.duapp.com");//["r"] ==>4个字母任意一个开头的 /^[xyzr].+/.exec("ruantao.duapp.com");//["ruantao.duapp.com"] ==>4个字母任意一个开头,后边任意个"非\n"的 //集合中取反 //[^xyzr]表示非x或y或z或r中的任意一个字符 /[^xyzr]/.exec("ruantao.duapp.com");//["u"] ==>非这4个字母的 /[rtcom]{2}/.exec("ruantao.duapp.com");//["co"] ==>匹配[rtcom]任意连续的两个,就是co了 //范围 /[1-9]/.exec("ruantao");//null ==>没有数字 //边界 //\b表示的边界 \B是非边界 //表达式/\bc/就是以c开头或结尾的 //数字 //\d表示数字的意思,相反,\D表示非数字 /\d/.exec("ruantao.duapp.com123");//["1"] //空白符 //\f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。 //\s匹配单个空格,等同于[\f\n\r\t\v] //\S表示非空格字符。 /\S+/.exec("ruantao com");//["ruantao"] ==>第一个空格时候停止了 //\w表示单词字符,等同于字符集合[a-zA-Z0-9_] /\w+/.exec("ruantao.duapp.com");//["ruantao"] ==>"."是非单词字,到"."就结束了 //\W表示非单词字符,等效于[^a-zA-Z0-9_] //反向引用 //最后的"\编号"代表之前,对应子正则的内容 /(\w)\1/.exec("ruantao,rr");//["rr", "r"] ==>(\w)对应"r", 之后\1引用"r",所以就是要找"rr". //结果["rr", "r"] 中 "rr"是全部正则匹配出来的内容, "r"是子正则(\w)匹配的内容 /(\w)(\w)\2\1/.exec("ruantao,ruur");//["ruur", "r", "u"] ==>头俩(\w)匹配ru,\2\1匹配ur, 加一块儿就是ruur //结果["ruur", "r", "u"]中,依次是全正则的内容, 第一个(\w)内容 , 第二个(\w)内容 //正向预查 //(?=pattern), 比如只需要ruantao1中的字符, 不需要ruantao2中的字符 /ruantao(?=com)/.exec("ruantaonet");//null ==>因为后边不是紧跟着1 //正向预查的反操作?!, /ruantao(?!=com)/.exec("ruantaonet");//["ruantao"] 312345678910111213141516171819202122//六.分组查询 //中括号表示范围内选择,大括号表示重复次数。小括号允许我们重复多个字符 //分组+量词 /(rt){2}/.exec("rtrt");//["rtrt", "rt"] //分组+范围 /([bd]ad)*/.exec("baddad");//["baddad", "dad"] ==>bad后边得有东西,所以是"baddad", //分组+分组 /(mon( and dad)?)/.exec(/mon and dad/);//["mon and dad", "mon and dad", " and dad"] //七.修饰符 // /i忽略大小写 , /m忽略"\n"的影响 ,/g继续查找 var str = "ruantao", reg = /\w/g; console.log(reg.exec(str));//["r", index: 0, input: "ruantao"] console.log(reg.lastIndex);//1 console.log(reg.exec(str));//["u", index: 1, input: "ruantao"] console.log(reg.lastIndex);//2 console.log(reg.exec(str));//["a", index: 2, input: "ruantao"] console.log(reg.lastIndex);//3 console.log(reg.exec(str));//["n", index: 3, input: "ruantao"] console.log(reg.lastIndex);//4