长属性名 短属性名 说明 input $_ 最近一次要匹配的字符串 lastMatch $& 最近一次的匹配项 lastParen $+ 最近一次匹配的捕获组 leftContext $` input字符串中lastMatch之前的文本 multiline $* 布尔值,表示是否所有表达式都使用多行模式 rightContext $' Input字符串中lastMarch之后的文本
使用这些属性,可以从exec()方法或test()方法执行的操作中提取出更具体的信息
//test()用于测试一个字符串是否匹配某个正则表达式,并返回一个布尔值 var text = 'this has been a short summer'; var pattern = /(.)hort/g; if(pattern.test(text)){ console.log(RegExp.input);//'this has been a short summer' console.log(RegExp.leftContext);//'this has been a ' console.log(RegExp.rightContext);//' summer' console.log(RegExp.lastMatch);//'short' console.log(RegExp.lastParen);//'s' console.log(RegExp.multiline);//false 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 }
javascript有9个用于存储捕获组的构造函数属性,在调用exec()或test()方法时,这些属性会被自动填充
[注意] 理论上,应该保存整个表达式匹配文本的RegExp.$0并不存在,值为undefined
//RegExp.$1\RegExp.$2\RegExp.$3……到RegExp.$9分别用于存储第一、第二……第九个匹配的捕获组 var text = 'this has been a short summer'; var pattern = /(..)or(.)/g; if(pattern.test(text)){ console.log(RegExp.$1);//sh console.log(RegExp.$2);//t }
实例方法
RegExp对象的实例方法共5个,分为两类。包括toString()、toLocalString()、valueOf()这3种对象通用方法和test()、exec()正则匹配方法
对象通用方法
RegExp对象继承了Object对象的通用方法toString()、toLocaleString()、valueOf()这三个方法
【toString()】
toString()方法返回正则表达式的字面量
【toLocaleString()】
toLocaleString()方法返回正则表达式的字面量
【valueOf()】
valueOf()方法返回返回正则表达式对象本身
[注意]不论正则表达式的创建方式是哪种,这三个方法都只返回其字面量形式
var pattern = new RegExp('[bc]at','gi'); console.log(pattern.toString()); // '/[bc]at/gi' console.log(pattern.toLocaleString()); // '/[bc]at/gi' console.log(pattern.valueOf()); // /[bc]at/gi var pattern = /[bc]at/gi; console.log(pattern.toString()); // '/[bc]at/gi' console.log(pattern.toLocaleString()); // '[bc]at/gi' console.log(pattern.valueOf()); // /[bc]at/gi
正则匹配方法
正则表达式RegExp对象的正则匹配方法只有两个:分别是exec()和test()
【exec()】
exec()方法专门为捕获组而设计,接受一个参数,即要应用模式的字符串。然后返回包含匹配项信息的数组,在没有匹配项的情况下返回null
在匹配项数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,如果模式中没有捕获组,则该数组只包含一项
返回的数组包含两个额外的属性:index和input。index表示匹配项在字符串的位置,input表示应用正则表达式的字符串
var text = 'mom and dad and baby and others'; var pattern = /mom( and dad( and baby)?)?/gi; var matches = pattern.exec(text); console.log(pattern,matches); //pattern.lastIndex:20 //matches[0]:'mom and dad and baby' //matches[1]:' and dad and baby' //matches[2]:' and baby' //matches.index:0 //matches.input:'mom and dad and baby and others'
对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec(),将始终返回第一个匹配项的信息;而在设置全局标志的情况下,每次调用exec()都会在字符串中继续查找新匹配项
var text = 'cat,bat,sat,fat'; var pattern1 = /.at/; var matches = pattern1.exec(text); console.log(pattern1,matches); //pattern1.lastIndex:0 //matches[0]:'cat' //matches.index:0 //matches.input:'cat,bat,sat,fat' var text = 'cat,bat,sat,fat'; matches = pattern1.exec(text); console.log(pattern1,matches); //pattern1.lastIndex:0 //matches[0]:'cat' //matches.index:0 //matches.input:'cat,bat,sat,fat'
var text = 'cat,bat,sat,fat'; var pattern2 = /.at/g; var matches = pattern2.exec(text); console.log(pattern2,matches); //pattern2.lastIndex:3 //matches[0]:'cat' //matches.index:0 //matches.input:'cat,bat,sat,fat' var text = 'cat,bat,sat,fat'; matches = pattern2.exec(text); console.log(pattern2,matches); //pattern2.lastIndex:7 //matches[0]:'bat' //matches.index:4 //matches.input:'cat,bat,sat,fat'
【tips】用exec()方法找出匹配的所有位置和所有值