/(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)xx10/.exec("12345678910xx10");//["12345678910xx10", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]/(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)xx11/.exec("12345678910xx10");//null4、如果捕获组嵌套捕获组,捕获组确定的顺序是内部从外到内,外部从左到右。来个代码体会一下。
//表达连续三个相同的小写,{2}应用在1身上/([a-z])1{2}/.exec("aaa");//["aaa", "a"]复制代码//一道有意思的正则问题/(w)((?=111)(1))/.exec("aa bbbb");//["bb", "b", "b", "b"]/*这里捕获组有三个,$1为(w)中的内容,$2为((?=111)(1))中的内容:需注意(?=111)并不是捕获组而是正则表达式的判断条件,x(?=y)表示匹配x仅仅当后面跟着y,判断条件并不是匹配结果的一部分。所以现在$2的内容为(1)即‘b"。$3就是1的内容。返回的匹配项“bb”中的第一个"b"为"aa bbbb"中的第一个"b",第二个"b"为"aa bbbb"中的第二个"b"。*//(w)(x(?=111)(1))/.exec("aa bxbbbcb");//["bxb", "b", "xb", "b"]//这里$2的内容为(x(?=111)(1))中的内容即x(1);//其实上面两种模式可以简化成/(w)(?=111)(1)/表示匹配w仅当该w后后面跟着三个1,然后获取的匹配项为该w且其后再紧跟着1的字符串。同理/(w)x(?=111)(1)/复制代码/(w)((?=111)(2))/.exec("aa bbbbv");//["b", "b", "", ""]/*捕获组$2为((?=111)(2))中的内容,由于此时还未执行完捕获组$2处的匹配,所以2表示""。$3即为2的内容还是""。所以这条匹配被解释为返回w且其后紧跟3个该w的字符串,返回w+""就只返回"b"了。*/正则表达式的标志位(flags)部分:var str="cat mat bat";str.replace(/at/gm,"AB");/*"cABmABbAB"*/正则表达式中的元字符部分:
( [ { ^ $ | ) ? * + . ] }//匹配"[bc]at"/[bc]at/.exec("xx[bc]at");//["[bc]at"]//匹配".at"/.at/.exec("xx.at");//[".at"] var p=/[bc]at/;new RegExp("[bc]at");// /[bc]at/1、当不传任何参数或参数一为空字符串时, new RegExp();// /(?:)/ 或 new RegExp("");// /(?:)/ ,表示匹配 "" 但不记住匹配项( "" 其实就是 ":" 之后的空串,不记住x匹配项的规则为(?:x)),所以在匹配任何字符串时都返回 [""] 。所以由此可以猜想一下javascript正则引擎内部机制应该是默认匹配 "" 且不记住该匹配项,除非显式声明在 ":" 之后的需要匹配的字符串,加上 "(?:)" 显式声明不记住匹配项。
var p=/\n/;//转义,字符""在字符串中常需要被转义为"\"p.exec("\nxx");//[" "]var p=new RegExp("\\n");// /\n/ 如果想获得正则表达式字面量为/\n/,需要在正则表达式中再来一层转义p.exec("\nxx");//[" "] 注意被匹配的字符串" xx"中 的也被转义了new RegExp("\n").exec(" ");// [""]/*RegExp("\n")返回/ /,即意思匹配换行符*/new RegExp(" ").exec(" ");//[""]/*new RegExp(" ")返回// ,表示并没有进行转义,而是返回字面量//,意思匹配换行符*/3、下面给出一些单重,双重转义模式的参考:第几次转义在表中已标出,单代表第一次转义,双代表在已经有的转义的基础上再进行的转义。

RegExp的实例属性:
通过实例的属性可以获取有关模式的各种信息
global :布尔值,表示是否设置了g标志。
ignoreCase :布尔值,表示是否设置了i标志。
multiline :布尔值,表示是否设置了m标志。
lastIndex :整数,表示开始搜索下一个匹配项的字符位置,从0算起。前提是设置g标志时才会有用。
source :正则表达式的字符串标志,按照字面量形式而非构造函数中的字符串模式返回字符串。
new RegExp("\\w");// /\w/ 返回自面量形式正则表达式new RegExp("\\w").source;// "\w" 字符串RegExp的实例方法:

exec():该方法是专门为捕获组而设计的,参数为要匹配的字符串,返回包含第一个匹配项信息和可能有的捕获组的数组,若未匹配到返回 null 。(返回的虽然是 Array 的实例,但还包含两个额外的属性: index 表示匹配项在字符串中的位置, input 表示应用正则表达式的字符串)
var arr=new RegExp("\\(w)").exec("\w");// ["w", "w"]arr;// ["w", "w"]arr.index;//0arr.input;// "w" 即exec()里的内容exec() 和 match() 方法的区别:
//返回全局匹配项演示比较var arr="ababcdab".match(/ab/g);// ["ab", "ab", "ab"]arr.index; // undefinedarr.input; // undefined/ab/g.exec("ababcdab");// ["ab"]//捕获组演示比较,match()方法和有无设置全局g标志有关"ababcdab".match(/a(b)/g);// ["ab", "ab", "ab"]var arr="ababcdab".match(/a(b)/);// ["ab", "b"]arr.index;// 0arr.input;// "ababcdab"/a(b)/g.exec("ababcdab");// ["ab", "b"]3、所以在选择使用方法的时候要先考虑好侧重该方法的哪方面功能,在不设置全局标志g的情况下,在同一个字符串上多次调用exec()则总是返回第一个匹配项的信息,而在设置全局标志的情况下,每次调用exec()则都会在字符串中沿着上次查找的位置往后继续查找新的匹配项。
//未设全局,每次从头开始查找var p=/a/;var str="ababa";var a=p.exec(str);// ["a"];var b=p.exec(str);// ["a"];a==b;// falsea.index==b.index;// true//设置全局,沿着上次位置继续查找新匹配var p=/a/g;var str="ababa";var a=p.exec(str);// ["a"]a.index;// 0var b=p.exec(str);// ["a"]b.index;// 2test():接收字符串参数,在模式与字符串参数匹配情况下返回 true ,否则返回 false 。常被用在 if() 中当判断条件。
var text="000-000-000";var p=/((d{3})-)1*2/; if(p.test(text)){ console.log("匹配成功");}RegExp 实例继承 Object 的 toLocaleString() 和 toString() 方法都会返回正则表达式的字面量形式的字符串,与如何创建正则表达式的方式无关。 valueOf() 则返回正则表达式字面量本身。var p=/[new]bi/;p.toLocaleString();// "/[new]bi/"p.toString();// "/[new]bi/"p.valueOf();// /[new]bi/var p=new RegExp("\[new\]bi");p.toLocaleString();// "/[new]bi/"p.toString();// "/[new]bi/"p.valueOf();// /[new]bi/
/(.)hort/g.exec("this is a short day");// ["short", "s"]//最近一次要匹配的字符串RegExp.input;// "this is a short day" 或RegExp["$_"]访问;//最近一次的匹配项RegExp.lastMatch;// "short" 或RegExp["$&"]访问;//在最近一次要匹配的字符串中的最近一次匹配项之前的文本 RegExp.leftContext;// "this is a " 或RegExp["$`"]访问;//在最近一次要匹配的字符串中的最近一次匹配项之后的文本 RegExp.rightContext;// " day" 或RegExp["$""]访问;//最近一次(最后一次)匹配的捕获组RegExp.lastParen;// "s" 或RegExp["$+"]访问;捕获组访问属性:还有9个用于存储捕获组的构造函数属性,访问语法是 RegExp.$n ,其中n取值1~9,用于获取第n个匹配的捕获组。在调用 exec() , test() 或 match() 等正则系列方法时这些属性会被自动填充。
var text="this is a short summer";var pattern =/(..)or(.)/g;if(pattern.test(text)){ console.log(RegExp.$1); // sh console.log(RegExp.$2); // t }模式的局限性: