经过这些属性能够获知一个正则表达式的各方面信息,可是却没有大用处,由于这些信息全都包含在模式声明中。例如:正则表达式
var reg = /\[bc\]at/i;
console.log(reg.global);// false
console.log(reg.igoreCase);//true
console.log(reg.miltiline);//false
console.log(reg.lastIndex);//0
console.log(reg.source);//'\[bc\]at'
var reg1 = new RegExp('\\[bc\\]',i);
console.log(reg1.global);// false
console.log(reg1.igoreCase);//true
console.log(reg1.miltiline);//false
console.log(reg1.lastIndex);//0
console.log(reg1.source);//'\[bc\]at'
复制代码
RegExp对象的主要方法是exec(),该方法专门为捕获”组“而设计的。exec()接受一个参数,要被匹配捕获的字符串,而后返回包含第一个匹配信息的数组;或者在没有匹配人会状况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性;index和input。其中index表示匹配项在字符中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是整个个正则匹配的字符串,其余项是与正则中分组匹配的字符串(若是该正则没有分组捕获,则该数组只包含一项)。express
var text = 'mom and dad and baby';
var reg = /mom(and dad(and baby)?)?/gi;
var matches = reg.exec(text);
conole.log(matches.index);//0
conole.log(matches.input);//'mom and dad and baby'
conole.log(matches[0]);//'mom and dad and baby'
conole.log(matches[1]);//'and dad and baby'
conole.log(matches[2]);//'and baby'
复制代码
上面的例子是否是验证我们说的匹配规则,exec() 方法执行的结果,若是正则匹配成功就会返回一个数组(数组的index,表示正则匹配的位于字符串的位置,数组的第一项是整个正则匹配的内容,数组的第二项是正则第一个分组捕获内容,第三项,是正则第二个分组捕获内容),不成功就会返回一个null。数组
对于exec()方法而言,即便在正则中设置了全局模式g,它每次也会返回一个匹配项信息。在没有设置全局标志的状况下,在同一个字符串屡次调用exec()将始终返回第一个匹配项的信息。而咋设置全局标志的状况下,每次都调用exec()则都返回在字符串中继续查找新的匹配项bash
var text = 'cat,bat,sat,fat';
var reg = /.at/;
var res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//0
res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//0
reg = /.at/g;
var res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//3
var res = reg.exec(text)
console.log(res.index);//5
console.log(res[0]);//bat
console.log(res.lastIndex);//8
var res = reg.exec(text)
console.log(res.index);//10
console.log(res[0]);//sat
console.log(res.lastIndex);//13
var res = reg.exec(text)
console.log(res.index);//15
console.log(res[0]);//fat
console.log(res.lastIndex);//18
var res = reg.exec(text)
console.log(res.index);//19
console.log(res);//null
console.log(res.lastIndex);//19
复制代码
切记在使用正则exec()方法的时候,想不断的匹配整个字符串的话,须要添加i标志IE 的 JavaScript 实如今 lastIndex 属性上存在误差,即便在非全局模式下, lastIndex 属性每次也会变化。函数
正则表达式的第二个方法 test(),它就是一个字符串参数,在能匹配成功的状况下返回 true,不然返回false。在只想知道目标字符串与该正则是否匹配的状况下,使用这个方法很是方便。所以,test经常使用在if中ui
var text = '000-00-0000';
var reg = /\d{3}-\d{2}-\d{4}/;
if(reg.test(test)){}
console.log('The pattern was matched.')
复制代码
相信小伙伴们对上面的属性和方法很熟悉,接下来看看,我们都不太熟悉的属性吧this
RegExp构造函数包含一些属性(这些属性在其余的语言版本中当作是静态属性)。这些属性适合于全部的正则表达式,并基于所执行的最后一次正则表达式操做而变化。关于这些属性的另外一个独特之处,能够经过两种方式范文他们。换句话来讲,这些属性分别有一个长属性名和一个短属性名(opera是个例外,它不支持短属性名)。下面列出构造函数的属性spa
长属性名称 短属性名称 说明设计
input $_ 最近一次要匹配的字符串。Opera未实现此属性
code
lastMatch $& 最近一次要匹配项。Opera未实现此属性
lastParent $+ 最近一次匹配的捕获组。Opera未实现此属性
leftContent $` input字符串中lastMatch以前的文本。
multiline $* 布尔值,表示是否全部表达式都使用多行模式。IE和Opera未实现此属性
rightContent $' Input字符串中lastMatch以后的文
除了上面简介的几个属性以外,还有多达9个用于存储捕获的组的构造函数属性。访问这些属性的语法使RegExp.$一、RegExp.$二、RegExp.$三、RegExp.$四、......RegExp.$9,分别用于存储第1、第2、第三.......第九个匹配的捕获组。在调用exec()或test()方法时,这些属性会被自动填充。而后咱们就能够这样使用它们。
var text = 'this has benn a short summer';
var reg = /(..)or(.)/g;
if(reg.test(text)){
console.log(RegExp.$1)// sh
console.log(RegExp.$2)//t
}
复制代码
这里建立一个包含两个捕获组正则,并用正则的test()方法去匹配该字符串,虽然test()方法只返回一个布尔值,单Regxp构造函数的属性$1和$2也会返匹配响应捕获组的字符串自动填充
** 即便存在这些限制,ECMAScript 正则表达式仍然是很是强大的,可以帮咱们完成绝大多数模式匹 配任务。这些属性中小伙伴们是否是有好多没有见过的**