[集]JS正则表达式学习
1 javascript 正则对象创建 和用法
<1>.var reCat = new RegExp("cat"); <2>.var reCat = /cat/; //Perl 风格 (推荐)
2 学习最常用的 test exec match search replace split 6个方法 ; g 继续往下走 i 不区分大小写
数量词贪婪,例:
var reg1 = /\d.{1,}A{2}/g; var reg2 = /\d.{1,}?A{2}/g; var reg3 = /\d.{1,}?A{2}/; str = "1.1AA22bAA33cAABBC"; str.match(reg1);//['1.1AA22bAA33cAA']; str.match(reg2);//['1.1AA','22bAA','33cAA'] str.match(reg3);//['1.1AA']
二 javascript 正则表达式是分组知识
// 前瞻 var sToMatch1 = "bedroom"; var sToMatch2 = "bedding"; var reBed = /bed(?=room)/; alert(reBed.test(sToMatch1)); //true alert(reBed.test(sToMatch2)); //false //负向前瞻 var reBed = /bed(?!room)/; alert(reBed.test(sToMatch1)); //false alert(reBed.test(sToMatch2)); //true
var sToMatch = "Important word is the last one."; var reLastWord = /^(.+?)\b/; reLastWord.test(sToMatch); alert(RegExp.$1); //Important /* 这里,正则表达式用惰性量词来制定在单词边界之前可以出现任何字符,且可以出现一次或 多次(如果使用贪婪性量词,表达式就匹配整个字符串)。 */ var data = " First second thind fourth fifth sixth "; var reCat = /\b(\S+?)\b/g; var arrdata = data.match(reCat); for (var i = 0; i < arrdata.length; i++) { alert(arrdata[i]); }
1.贪心模式:如果我们希望正则尽量少地匹配字符,那么就可以在表示数字的符号后面加上一个?。组成如下的形式:
{n,}?, *?, +?, ??, {m,n}?
2.点:‘.’会匹配字符串中除了换行符\n之外的所有字符
3./^开头,结尾$/:reg = /^b|c.+/;(匹配b或者c.+)
4.非:^在正则表达式开始部分的时候表示开头的意思,例如/^c/表示开头是c;但是在字符集和中,它表示的是类似“非“的意思,如:[^0-9]表示非数字,[^a-z]表示非小写字母
5.边界:\b表示的边界的意思,也就是说,只有字符串的开头和结尾才算数。例如/\bc/就表示字符串开始的c或者是结尾的c(注:\B非边界)
6.数字:\d表示数字的意思,相反,\D表示非数字
7.空格:\f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。\s匹配单个空格,等同于[\f\n\r\t\v](\S表示非空格字符)
8.单词:\w表示单词字符,等同于字符集合[a-zA-Z0-9_](\W表示非单词字符,等效于[^a-zA-Z0-9_])
9.反向引用:/(子正则表达式)\1/(先匹配子正则表达式,然后再匹配整个的,其中的\1代表第一个子正则)例 :
reg = /(\w)(\w)\2\1/; str='woow'; execReg(reg,str);//结果:woow, w, o
//说明:第一个子正则表示w,第二个子正则表示o,然后\2表示第二个子正则o与剩下的字符串匹配,\1表示第一个子正则w与再剩下的匹配,得到的结果是
//首先是整体:woow,其次是第一个的正则w,再次才是第二个的正则o
10.不记录正则表达式的匹配结果:使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果。但这时反向引用也不好使了
11.正向预查:意思就是:要匹配的字符串,后面必须紧跟着pattern!(形式:(?=pattern))说明:
正则表达式/cainiao/会匹配cainiao。同样,也会匹配cainiao9中的cainiao。但是我们可能希望,cainiao只能匹配cainiao8中的菜鸟。这时候就可以像下面这样写:/cainiao(?=8)/
12.?!:形式(?!pattern)和?=恰好相反
13.元字符:*,+,?,\,.,$,(),[],{},|,^,
转义字符:\f:换页;\n:换行;\r:回车;\t:制表;\b:退格;\o:空字符;\xnn:十六进制ASCII码;\uxxxx:十六进制指定的Unicode字符
预定义字符:{.,[^\n\r]},{\d,[0-9]},{\w,[0-9a-zA-Z_]},{\s,[\f\t\n\r]},{[\b],退格字符}
其他html字符:{&,&}、{", "}、{<,<}、{>,>}、{ ,空格}
str = "Great hope make great man"; reg = /\s\w+\s/; reg.match(str);//["make","great"] //原因:Great前,man后没有空白符, 而make前后的空白符被hope,great占用
14.修饰符:<1>.g:全局修饰符<2>i:不分大小写修饰符<3>.m:行首行尾修饰符
15.exec方法:用实例来说明
//公共函数实例:
function execReg(reg,str){
var result = reg.exec(str); document.write('string:' + result + '<br />' + 'index:'+result.index+'<br />' + 'input:'+result.input+'<br />' ); for(i=0;i<result.length;i++){ document.write('result['+i+']:'+result[i]+'<br />') } }
<1>返回值:exec方法返回的其实并不是匹配结果字符串,而是一个对象
var reg = /(\w)/; var str='bbs.bblueidea.com'; execReg(reg,str);
//结果:是个对象,index为在这个串中的index值,input为对应的那个字符串
//string:b
//index:0
//input:bbs.bblueidea.com
//result[0]:b
//result[1]:b
<2>对正则表达式的更新:
var reg = /b/g; var str = 'bs.blueidea.com'; execReg(reg,str); execReg(reg,str);
//结果:这儿用到了全局修饰符,这儿的第一个是指向第一个b,第二个是指向第二个b(在第一个的基础上找剩下的字符串中对应正则的串)
//string:b
//index:0
//input:bs.blueidea.com
//result[0]:b
//string:b
//index:3
//input:bs.blueidea.com
//result[0]:b
16.test方法:仅仅检查是否能够匹配str,并且返回布尔值以表示是否成功
17.match方法:返回结果也是对象
18.replace,search,split方法:replace返回替换后的值,search返回序号,split返回切割后的数组
var reg = /(\w+)\s(\w+)/; var str = 'cainiao gaoshou'; var newStr = str.replace(reg,'$2 $1'); document.write(newStr); //gaoshou cainiao
由于在替换文本里$有了特殊的含义,所以我们如果想要是用$这个字符的话,需要写成$$
var reg = /(\w+)\s(\w+)/; var str = 'cainiao gaoshou'; var newStr = str.replace(reg,'$$ $$'); document.write(newStr); //$ $
var reg = /\W/; var str = 'bbs.blueidea.com'; var pos = str.search(reg); document.write(pos); //3
var reg = /\W/; var str = 'http://www.baidu.com/'; var arr = str.split(reg); document.write(arr.length+'<br />'); document.write(arr); //7 //http,,,www,baidu,com,
参考资料: