超全的js正则表达式整理笔记
var reCat = new RegExp("cat","gi"); //RegExp构造函数可以带一个或两个参数,第一个参数描述需要进行匹配的模式字符串,第二个参数指定了额外的处理命令 var reCat = /cat/gi; //使用Perl风格的语法 i:执行对大小写不敏感的匹配 g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m:执行多行匹配 元字符 元字符是表达式语法的一部分,在正则表达式中用到的所有元字符有:{ [ ( ^ $ | ) ] } ? * + - xxx 查找以八进制数 xxx 规定的字符,如:/142/为字符b xdd 查找以十六进制数 dd 规定的字符,如:/x62/为字符b uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符,如:/u0062/为字符b r 查找回车符 n 查找换行符 f 查找换页符 t 查找制表符 v 查找垂直制表符 a 查找alert字符 e 查找escape字符 cX 查找与X相对应的控制字符 查找 NULL 字符 . 查找单个字符,除了换行和行结束符,等同于[^nr] w 查找单词字符,等同于[a-zA-Z_0-9] W 查找非单词字符,等同于[^a-zA-Z_0-9] d 查找数字,等同于[0-9] D 查找非数字字符,等同于[^0-9] s 查找空白字符,等同于[ tnx0Bfr],x0B为垂直tab和t一样 S 查找非空白字符,等同于[^ tnx0Bfr] 方括号 [abc] 查找方括号之间的任何字符 [^abc] 查找任何不在方括号之间的字符 [0-9] 查找任何从 0 至 9 的数字 [a-z] 查找任何从小写 a 到小写 z 的字符 [A-Z] 查找任何从大写 A 到大写 Z 的字符 [A-z] 查找任何从大写 A 到小写 z 的字符 [adgk] 查找给定集合内的任何字符 [^adgk] 查找给定集合外的任何字符 量词 var sToMatch = "abbbaabbbaaabbb1234"; var re1 = /.*bbb/g; //匹配结果为"abbbaabbbaaabbb" var re2 = /.*?bbb/g; //只有惰性量词才能匹配成功,匹配结果为"abbb","aabbb","aaabbb" var re3 = /.*+bbb/g; //匹配不了,直接报错 复杂模式之分组:通过一系列括号包围一系列字符、字符类以及量词来使用的 var sToMatch = "#123456789"; var reNumbers = /#(d+)/; reNumbers.test(sToMatch); alert(RegExp.$1); //"123456789",$1保存了第一个反向引用,依次可以用$2,$3... 然后,可以直接在定义分组的表达式中包含反向引用,通过使用特殊转义序列如1、2等实现 var sToMatch = "dogdog"; var reDogdog = /(dog)1/; //等同于/dogdog/ alert(reDogdog.test(sToMatch)); //true 第三,反向引用可以用在String对象的replace()方法中,通过使用特殊字符序列如$1、$2等实现 var sToChange = "1234 5678"; var reMatch = /(d{4}) (d{4})/; alert(sToChange.replace(reMatch,"$2 $1")); //"5678 1234" 复杂模式之候选:使用管道符(|)放在两个单独的模式之间 var reBadWords = /badword | anotherbadword/gi; var sUserInput = "This is a String using badword1 and badword2."; var sFinalText = sUserInput.replace(reBadWords,function(sMatch){ return sMatch.replace(/./g,"*"); //用星号替换敏感词中的每一个字母 }); 复杂模式之非捕获性分组:相比捕获性分组,不会创建反向引用,在较长的正则表达式中,存储反向引用会降低匹配速度,通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销 var sToMatch = "#123456789"; var reNumbers = /#(?:d+)/; //只需要在左括号的后面加上一个问号和一个紧跟的冒号就可创建一个非捕获性分组 reNumbers.test(sToMatch); alert(RegExp.$1); //"",输出空字符串是因为该分组是非捕获性的 alert(sToMatch.replace(reNumbers,"abcd$1")); //输出结果是"abcd$1"而不是"abcd123456789",不能使用任何反向引用 又如: String.prototype.stripHTML = function(){ var reTag = /<(?:.|s)*?>/g; //匹配所有的HTML标签,防止插入恶意HTML代码 return this.replace(reTag,""); } 复杂模式之前瞻:告诉正则表达式运算器向前看一些字符而不移动其位置,存在正向前瞻(检查接下来出现的是不是某个特定字符集)和负向前瞻(检查接下来的不应该出现的特定字符集) var sToMatch1 = "bedroom"; var sToMatch2 = "bedding"; var reBed1 = /(bed(?=room))/; var reBed2 = /(bed(?!room))/; alert(reBed1.test(sToMatch1)); //true alert(RegExt.$1); //输出"bed"而不是"bedroom" alert(reBed1.test(sToMatch2)); //false alert(reBed2.test(sToMatch1)); //false alert(reBed2.test(sToMatch2)); //true alert(RegExt.$1); //输出的也是"bed" 复杂模式之边界:用于正则表达式中表示模式的位置 var sToMatch = "First secondnthird fourthnfifth sixth"; var reLastWordOnLine = /(w+)$/gm; alert(sToMatch.match(reLastWordOnLine)); //输出["second","fourth","sixth"]而不只是"sixth" RegExp对象的属性和方法: var sToMatch = "bbq is short for barbecue"; var reB = /b/g; reB.exec(sToMatch); alert(reB.lastIndex); //1,匹配位置是0,lastIndex为1 reB.exec(sToMatch); alert(reB.lastIndex); //2 reB.exec(sToMatch); alert(reB.lastIndex); //18 reB.lastIndex = 0; //重头开始匹配 reB.exec(sToMatch); alert(reB.lastIndex); //1而不是21 静态属性 var sToMatch = "this has been a short,short summer"; var reShort = /(s)hort/g; reShort.test(sToMatch); alert(RegExg.input); //"this has been a short,short summer"; alert(RegExg.leftContext); //"this has been a "; alert(RegExg.rightContext); //",short summer"; alert(RegExg.lastMatch); //"short" alert(RegExg.lastParen); //"s" compile() //编译正则表达式 alert(reCat.exec("a cat,a Cat,a cAt caT")); //返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用 alert(reCat.test("cat")); //true,检索字符串中指定的值,返回 true 或 false。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |