RegExp正则表达式(五)–js中RegExp对象中的属性

RegExp对象中除了有一些方法外,还包含一些属性。这些属性有助于我们得到一些关于该对象的有用信息。

RegExp对象的属性可以分为两大类,即:

  • 实例属性
  • 静态属性

实例属性

RegExp对象被实例化后,返回的对象其中包含的属性就叫做实例属性。
RegExp对象的普通定义和构造函数定义都是实例化RegExp对象。

RegExp对象的实例属性包括:

实例属性作用
lastIndex用于控制该RegExp对象进行检索的位置(位置从0开始),可读写。RegExp对象中的exec()方法和test()方法中,如果匹配成功且全局匹配就会自动设置该属性的值为匹配的字符串最后一个字符紧后一个字符的索引位置,以确保下一次匹配是从该位置开始检索;如果匹配成功且非全局匹配,则会自动设置该属性的值为0,以确保下一次匹配是字符串开头位置开始检索;如果匹配失败,则会自动设置该属性的值为0,以确保下一次匹配是字符串开头位置开始检索;另外,我们可以手动设置该属性的值,来自定义匹配时检索的位置。
global只读。判断某一RegExp对象是否为全局匹配(g)。如果设置了g则返回true,否则返回false
ignoreCase只读。判断某一RegExp对象是否区分大小写(i)。如果设置了i则返回true,否则返回false
multiline只读。判断某一RegExp对象是否多行匹配(m)。如果设置了m则返回true,否则返回false
source只读。返回常量表示的正则表达式。

举个栗子

例1:

var reg1 = /(\d+)-(\w+)/gim;
var reg2 = /(\d+)-(\w+\d)/;  
var res1=reg1.exec("wwww2013-love-b2017-love");  
var res2 = reg2.exec("w1997-good1");
console.log("lastIndex属性:"+reg1.lastIndex+"==="+reg2.lastIndex); 
console.log("global属性:"+reg1.global+"==="+reg2.global); 
console.log("ignoreCase属性:"+reg1.ignoreCase+"==="+reg2.ignoreCase); 
console.log("multiline属性:"+reg1.multiline+"==="+reg2.multiline); 

/***
****lastIndex属性:13===0
****global属性:true===false
****ignoreCase属性:true===false
****multiline属性:true===false
***/

例2:

var reg1 = /(\d+)-(\w+)/gim;
var reg2 = new RegExp("(\\d+)-(\\w+\d)");  
//变量正则表达式中"\"表示转义
/***
****reg2的变量正则表达式转换为常量正则表达式为:
****reg2 => /(\d+)-(\w+d)/
***/
var res1=reg1.exec("wwww2013-love-b2017-love");  
var res2 = reg2.exec("w1997-good1");
console.log("source属性:"+reg1.source+"==="+reg2.source); 

/***
****source属性:(\d+)-(\w+)===(\d+)-(\w+d)
***/

静态属性

暂且可以把静态属性理解为”RegExp.静态属性”这种格式。和实例属性不同的是,静态属性是共用的属性,即程序中所有定义的RegExp对象使用的都是同一个属性。

RegExp对象的静态属性包括:

实例属性作用
input只读。返回所有的RegExp对象最后一次匹配时所在的字符串。初始值为空字符串。可以简写为 $_ , 如果浏览器不支持RegExp.$_ 这样的格式,可以写成RegExp[“$_”]这种格式
lastMatch只读。所有的RegExp对象最后一次匹配到的字符串。初始值为空字符串。可以简写为 $&,如果浏览器不支持RegExp.$& 这样的格式,可以写成 RegExp[“$&”] 这种格式
lastParen只读。如果表达式模式中有括起来的子匹配,是当前表达式模式中最后的子匹配所匹配到的子字符串。初始值为空字符串可以简写为 $+,如果浏览器不支持 RegExp.$+ 这样的格式,可以写成 RegExp[“$+”] 这种格式
leftContext只读。是当前表达式模式最后一个匹配字符串左边的所有内容,初始值为空字符串””。可以简写为 $` (其中 ` 为键盘上“Esc”下边的反单引号),如果浏览器不支持 RegExp.$` 这样的格式,可以写成 RegExp[“$`”] 这种格式
rightContext只读。是当前表达式模式最后一个匹配字符串右边的所有内容,初始值为空字符串””。可以简写为 $’(其中 ’ 为单引号),如果浏览器不支持 RegExp.$\’ 这样的格式,可以写成 RegExp[“$’”] 这种格式
$1到$9只读。如果表达式模式中有括起来的子匹配,$1…$9属性值分别是第1个到第9个子匹配所捕获到的内容。如果有超过9个以上的子匹配,$1…$9属性分别对应最后的9个子匹配。在一个表达式模式中,可以指定任意多个带括号的子匹配,但RegExp对象只能存储最后的9个子匹配的结果

举个栗子

例1:

var reg1 = /(\d+)-(\w+)/gim;
var reg2 = new RegExp(“(\\d+)-(\\w+\\d)”);
var res1=reg1.exec(“wwww2013-love-b2017-love”);
console.log(“input属性:”+RegExp.input);
console.log(“lastMatch属性:”+RegExp.lastMatch);
console.log(“lastParen属性:”+RegExp.lastParen);
console.log(“leftContext属性:”+RegExp.leftContext);
console.log(“rightContext属性:”+RegExp.rightContext);
console.log(“括号中子表达式的应用:”+RegExp.$1+”===”+RegExp.$2);

/***input属性:wwww2013-love-b2017-love2
****lastMatch属性:2013-love
****lastParen属性:love
****leftContext属性:wwww
****rightContext属性:-b2017-love2
****括号中子表达式的应用:2013===love
***/

var res2 = reg2.exec(“w1997-good1”);
console.log(“input属性:”+RegExp[“$_”]);
console.log(“lastMatch属性:”+RegExp[“$&”]);
console.log(“lastParen属性:”+RegExp[“$+”]);
console.log(“leftContext属性:”+RegExp[“$`”]);
console.log(“rightContext属性:”+RegExp[“$'”]);
console.log(“括号中子表达式的应用:”+RegExp[“$1”]+”===”+RegExp[“$2”]);

/***input属性:w1997-good1
****lastMatch属性:1997-good1
****lastParen属性:good1
****leftContext属性:w
****rightContext属性:
****括号中子表达式的应用:1997===good1
***/
/**注:此时的的RegExp.$1,RegExp.$2的值已经变了。不再是2013===love,而是由1997===good1覆盖了***/

实例属性与静态属性的区别

js中RegExp的构造函数可能是这样写的:

function RegExp(reg){
    //此处的属性为实例属性
    this.lastIndex = xxxx;
    this.global = xxxx;
    ...
}
//此处的属性为静态属性.prototype为RegExp的原型对象
RegExp.prototype.input = xxxx;
RegExp.prototype.lastMatch = xxxx;
... 
var reg1 = new RegExp("\\w");
var reg2 = /\w/;

实例属性和静态属性不同的是,在每个实例化后的RegExp对象中,它们的实例属性都是相互独立,互不影响的。每个是实例属性的修改都是在自己的RegExp对象上修改,不影响其他RegExp对象上的该属性的值。

而静态属性是共用属性,每个RegExp对象修改静态属性的值时,其实是修改同一个引用。所以该属性的值会改变

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值