javascript中的Regexp简单了解
2012-04-08 19:50 jalen 阅读(466) 评论(0) 编辑 收藏 举报/***************** RegExp对象的主要方法:*********************/ /* * exec() : 该方法专门为捕获组设计的。 @param : 接受一个参数,要应用模式的字符串 @return : 返回包含第一个匹配项信息的数组(array),没有匹配项的情况下返回null @explain : 返回的数组是Array的实例,并且包含2个额外的属性: index - 表示匹配项在字符串中的位置 input - 表示应用正则表达式的字符串 数组中的第一项是与整个模式匹配的字符串,其他项是模式中的捕获组匹配的字符串(如果没有捕获组,则返回数组只包含一项) */ var text = 'gid and var and global'; var patterns = /gid( and var( and global)?)?/; var matches = patterns.exec(text); console.log(matches.index); //0 整个字符串从0位置开始就与模式匹配,所以返回的数组matches的index为0 console.log(matches.input); //"gid and var and global" 表示正则表达式要匹配的字符串 console.log(matches[0]); //"gid and var and global" 数组第一项是匹配的整个字符串 console.log(matches[1]); //" and var and global" ( and var( and global)?)?第二项包含的是与第一个捕获组匹配的内容 console.log(matches[2]); //" and global" ( and global)? 第三项包含与第二个捕获组匹配的内容 console.log(matches[3]); //undefined 没有第三个捕获组, return undefined //exec()方法,即使在模式中设置了全局标志(g),他每次也只会返回一个匹配项。 //不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息, //而在设置了(g)下,在同一个字符串上多次调用exec()则都会返回字符串中继续查找新匹配项 //{IE下lastIndex即使在非g模式下,也会每次变化。} var txt = 'cat, bat, sat, fat'; var patterns1 = /.at/; var matches1 = patterns1.exec(txt); console.log(matches1.index); //0 从0位置开始就已经匹配到了 console.log(matches1[0]); //cat console.log(patterns1.lastIndex); //0 开始搜索下一个匹配项的字符串位置。 matches1 = patterns1.exec(txt); console.log(matches1.index); //0 console.log(matches1[0]); //cat console.log(patterns1.lastIndex); //0 var patterns2 = /.at/g; var matches2 = patterns2.exec(txt); console.log(matches2.index); //0 console.log(matches2[0]); //cat console.log(patterns2.lastIndex); //3 matches2 = patterns2.exec(txt); console.log(matches2.index); //5 console.log(matches2[0]); //bat console.log(patterns2.lastIndex); //8 /* * test() * @param : {type:String} * @return : {type:Boolean} * @explains : 匹配的情况下return true,否则return false, */ var stxt = '000-12-2354'; var patterns3 = /\d{3}-\d{2}-\d{4}/; if(patterns3.test(stxt)){ console.log("match sucess!") } /* * toLocalString()和toString() * @return :返回正则表达式的字面量形式,与创建正则表达式的方式无关。 */ var patterns4 = new RegExp("\\[bc\\]at","gi"); var patterns5 = /\[bc\]at/gi; console.log(patterns4.toLocaleString(),patterns4.toString()); // /\[bc\]at/gi /\[bc\]at/gi console.log(patterns5.toLocaleString(),patterns5.toString()); // /\[bc\]at/gi /\[bc\]at/gi
/***************** RegExp构造函数的属性(這些属性在其他语言里被看作是静态属性):*********************/ /* * 分为长属性名和短属性名 * input $_ 最近一次要匹配的字符串 * lastMatch $& 最近一次的匹配项 * lastParen $+ 最近一次匹配的捕获组 * leftContext $` input字符串中lastMatch之前的文本 * multiline $* 布尔值,表示是否所有表达式都使用多行模式。 * rightContext $' input字符串中lastMatch之后的文本 * 這些属性适用于作用域中的所有正则表达式 * 注意:opera不支持input、lastMatch、lastParen和multiline属性 * IE不支持multiline属性 */ var text = 'this has been a short summer'; var pattern = /(.)hort/g; if(pattern.test(text)){ console.log(RegExp.input + ';','shortAttr:' + RegExp.$_ + ';');//this has been a short summer console.log(RegExp.leftContext); //"this has been a" 匹配short之前文本 console.log(RegExp.rightContext); //" summer" 匹配short之后文本 console.log(RegExp.lastMatch); //"short" 最后一次的匹配项 console.log(RegExp.lastParen); //"s" 最近的一次匹配捕获组(.)第一个字符放在了捕获组中 console.log(RegExp.multiline); //false; 不支持多行模式 } //通过短属性名来代替,由于短属性名大都不是有效的ECMAScript标识符,因此必须通过方括号语法来访问他们。 var text1 = 'this has been a short summer'; var pattern1 = /(.)hort/g; if(pattern1.test(text1)){ console.log(RegExp["$_"]); //"this has been a short summer" console.log(RegExp["$`"]); //"this has been a " console.log(RegExp["$'"]); //" summer" console.log(RegExp["$&"]); //short console.log(RegExp["$+"]); //s 最近的一次匹配捕获组(.)第一个字符放在了捕获组中 console.log(RegExp["$*"]); //false } /* * 除了上面的属性外,还有多达9个用于存储捕获组的构造函数属性。 * 這些属性的语法RegExp.$1、RegExp.$2....RegExp.$9 * 分别储存第一,第二.....第九个匹配的捕获组。在调用exec(),test()方法时,這些属性会自动填充。 * 即便调用test()返回一个布尔值,RegExp构造函数的属性$1,$2也会自动填充的。 */ var text2 = 'this has been a short communication' var pattern2 = /(..)ic(...)o(.)/; if(pattern2.test(text2)){ console.log(RegExp.$1); //un console.log(RegExp.$2); //ati console.log(RegExp.$3); //n }
/*******************************字符串的模式匹配方法**********************/ /* * match() @param : 一个参数,正则表达式或者RegExp对象。 @return : 返回一个数组,和exec()类似。 * search(regexp) @param :和match()参数相同。 @return :字符串中第一个与 regexp 相匹配的子串的起始位置。返回第一个匹配的索引;如果没找到返回-1; @explain :始终从字符串的开头向后查找 * replace(regexp/string,string/function) @param : 第一个参数是RegExp对象或者一个字符串(字符串不会被转换为正则表达式),(用什么模式或者字符串来替换) @param :第二个参数可以是个字符串或者是一个函数(被替换的内容) @return : 一个新的字符串,是用 string/function 替换了 regexp/string 的第一次匹配或所有匹配之后得到的。 @explain :要替换所有子字符串,必须提供一个正则表达式,并且设置了全局(g) @extra : 如果第二个参数是个字符串,可是可以使用字符序列(短属性名方式),将正则表达式操作得到的值插入到结果字符串中 split(string/regexp,Array.length) @param : 第一个参数可以是分隔符,分隔符可以是字符串,或者是一个regexp对象 @param : 规定数组的长度,以便返回的数组不会超过指定长度。 @return : array 返回一个匹配后的数组。 */ var text = 'cat, bat, sat, fat'; var pattern = /.at/; //与pattern.exec(text)相同 var matches = text.match(pattern); console.log(matches.index); //0 console.log(matches[0]); //cat console.log(pattern.lastIndex); //0 var text1 = 'sst, bat, sat, fat'; var pos = text1.search(/at/); var pos1 = text1.search(/at/); console.log(pos,pos1); //6 6 匹配上了bat var result = text.replace('at', 'oncat'); console.log(result); //concat, bat, sat, fat var result1 = text.replace(/at/g, 'fs'); console.log(result1); //cfs, bfs, sfs, ffs //第二个参数为字符串的; $1,捕获组的第一项,也就是(.at)匹配到的 var result2 = text.replace(/(.at)/g, 'fuck[$1]'); console.log(result2); //fuck[cat], fuck[bat], fuck[sat], fuck[fat] var colorText = "red,blue,green,yellow"; var r1 = colorText.split(","); var r2 = colorText.split("," ,2); var r3 = colorText.split(/[^\,]+/); console.log(r1); //["red", "blue", "green", "yellow"] console.log(r2); //["red", "blue"] console.log(r3); //["", ",", ",", ",", ""]