JS正则表达式exec()与String.prototype.match()的差异

在Javascript中,使用正则表达式有两种方法,一是通过String调用正则表达式,二是通过正则表达式拆分字符串,在大部分的情况下,它们的表现类似,都可以轻松实现测试字符串的功能,如下:

var text = '[DTools]              [logs]                [Program Files]',
    //  正则表达式,注意g的使用
    pattern = /\[([^\]]+)\]/g
//  正则表达式方法  
console.log(pattern.test(text))
//  字符串方法
console.log(text.match(pattern) != null)

对于String的方法与正则表达式的方法(共两个,一是exec,二是test),最大的差异在于正则表达式的方法在携带“g”标志的情况下,在返回的结果中会记住上次字符串检索的位置(lastIndex),并体现在第二次的搜索过程中(以index属性的方式),exec()第二次搜索结果示例如下:

0:"[logs]"
1:"logs"
#   本次搜索从这里开始
index:22
input:"[DTools]              [logs]                [Program Files]"
length:2

针对上述的差异,所以我们可以使用正则表达式exec()执行更细粒度的复合操作,比如既检索出所有匹配的字符串,又检索出所有匹配字符串的分组信息,而这一点恰恰是字符串的方法无法做到的。

继续以第一段代码为例,如果要找出所有“[]”包含的字符串,如果采用String的match()方法,我们需要进行两次正则表达式匹配,如下:

var text = '[DTools]              [logs]                [Program Files]',
    pattern = /\[([^\]]+)\]/g,
    results = text.match(pattern)
//  第一步的输出结果是["[DTools]", "[logs]", "[Program Files]"]
if(results != null) {
    var contentPat = /[^\[\]]+/,
        values = []
    results.forEach(function(item) {
        //  必须再进行一次正则匹配
        console.log(item.match(contentPat)[0])
    })
}

如果改用正则表达式的exec方法,则只需要一个正则表达式,如下:

var text = '[DTools]              [logs]                [Program Files]',
    pattern = /\[([^\]]+)\]/g       
//   能记住上次匹配的位置,所以能进行循环    
while((result = pattern.exec(text)) != null) {
    console.log(result[1])
}

结论

在正则表达式的应用中,String的方法可以一次匹配多个模式,但难以深入下一个层次,而正则表达式的exec()则可以充分利用正则表达式的全局匹配,循环获取多层次的分组信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值