javascript正则表达式(5)——JS中test()与exec()方法

RegExp.prototype.test(str) //参数就是一个字符串

1.用于测试字符串参数中是否存在匹配正则表达式模式的字符串

2.存在就返回true,否则返回false

这里有一个特殊现象

reg使用了对象属性/g,为什么第三遍test的时候会出现false?而第四遍又成了true?实际上是lastIndex这个属性在作怪,这里我们回顾一下lastIndex属性:

lastIndex 是当前表达式匹配内容的最后一个字符的下一个位置。



结果显示1 2

我们分析一下

表达式匹配内容:就是第一遍匹配的结果\w,就是字母a

最后一个字符:因为就一个字符,最后一个还是它本身。

下一个位置:第一个下标默认为0,下一个就是0+1=1

那么,第二次匹配到了b字符,b的下一个字符也就是当前下标加上1,等于2.因为下一个字符为空,没有最后一个字符(没有匹配的字符本身),所以退出循环(此时lastIndex重置为0,这也就解释了上面说的,为什么第三遍的结果是false,因为没有下一个位置。第四遍重置回0后,结果又成了trues,得出结论:全局属性,可以累加和重置,在非全局下,lastIndex根本就不生效),

最终结果显示 12

如果,我们不光想知道lastIndex,我们还想知道它从第几个开始匹配的?它现在匹配的是谁?应该怎么办?那就要用下面的方法了:

RegExp.prototype.exec(str)


1.使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果(其实就是lastIndex所反映的结果)

2.如果没有匹配的文本则返回null,否则返回一个结果数组:

    1index 声明匹配文本的第一个字符的位置

    2input 存放被检索的字符串string

 

                                                                              非全局调用

1.调用非全局的RegExp对象的exec()时,返回数组

2.第一个元素与正则表达式相匹配的文本

3.第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话)

4.第三个元素是与RegExpObject的第二个子表达式相匹配的文本(如果有的话),以此类推。


请看例子:


第一个0:在非全局下,lastIndex根本不生效,所以为0

第二个0:有实际含义,因为第一个字符下标为0,如果把

ts='1a2b3c4d5e'改为ts='$1a2b3c4d5e',则第二个0变为1.

1a2:当前匹配的内容

a:第一个分组内容

匹配的总数在结果数组中显示,结果数组为ret。下图为第一次进行匹配的信息

当调用了全局属性:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值