zoukankan      html  css  js  c++  java
  • String.match()与RegExp.exec()

    最近看了《javascript权威指南》里面的正则部分,match和exec方法有一些相同点和不同点,在这里写一下加深一下印象。

    1. 这两个方法,如果匹配成功,返回一个数组,匹配失败,返回null。

    2. 当RegExp的global属性为false时,这两个方法的返回数组是一样的。

      数组的第0个元素是整个pattern的第一个匹配字符串,接下来的元素是pattern第一个匹配中的子匹配字符串。

      此外,数组还有index和input两个额外属性,index是匹配字符串的起始位置,input是整个输入字符串。

      此时,RegExp的lastIndex属性一直是0。

    demo:

        var s = 'this is a string';
        var p = /\b\w*(i)s\b/;
        var rm = s.match(p);
        var re = p.exec(s);
        console.log('match_array: ' + JSON.stringify(rm));
        console.log('match_array_index: ' + rm.index);
        console.log('match_array_input: ' + rm.input);
        console.log('----------------------------');
        console.log('exec_array: ' + JSON.stringify(re));
        console.log('exec_array_index: ' + re.index);
        console.log('exec_array_input: ' + re.input);

    显示结果为(firefox控制台):

    match_array: ["this","i"]
    
    match_array_index: 0
    
    match_array_input: this is a string
    
    ----------------------------
    
    exec_array: ["this","i"]
    
    exec_array_index: 0
    
    exec_array_input: this is a string

    3. 当RegExp的global属性为true时,返回的数组是不同的。

      match方法返回的数组包含着所有匹配字符串,没有子匹配字符串和额外属性。此时,lastIndex属性无效。

      exec方法返回的数组格式与global为false时一样,只是此时RegExp的lastIndex属性有效,匹配是从lastIndex所指示的字符开始的,并且方法执行后会将lastIndex置为本次匹配字符串的下一个字符处,所以循环执行exec方法时会依次匹配整个字符串,直到字符串最后返回null,并将lastIndex置0。

    demo:

        var s = 'this is a string';
        var p = /\b\w*(i)s\b/g;
        var rm = s.match(p);
        var re;
        console.log('match_array: ' + JSON.stringify(rm));
        console.log('match_array_index: ' + rm.index);
        console.log('match_array_input: ' + rm.input);
        while(re = p.exec(s)){
            console.log('----------------------------');
            console.log('exec_array: ' + JSON.stringify(re));
            console.log('exec_array_index: ' + re.index);
            console.log('exec_array_input: ' + re.input);
            console.log('regexp_lastIndex: ' + p.lastIndex);
        }
        console.log('----------------------------');
        console.log('exec_array: ' + re);
        console.log('regexp_lastIndex: ' + p.lastIndex);

    结果:

    match_array: ["this","is"]
    
    match_array_index: undefined
    
    match_array_input: undefined
    
    ----------------------------
    
    exec_array: ["this","i"]
    
    exec_array_index: 0
    
    exec_array_input: this is a string
    
    regexp_lastIndex: 4
    
    ----------------------------
    
    exec_array: ["is","i"]
    
    exec_array_index: 5
    
    exec_array_input: this is a string
    
    regexp_lastIndex: 7
    ----------------------------
    
    exec_array: null
    regexp_lastIndex: 0

    综上:

    1. 在没有g标识符时,match和exec方法效果是一样的;有g标识符时,exec方法可以提供最完整的匹配结果。
    2. 这里顺便提一下RegExp.test()方法,它是exec方法的简化版,有匹配结果就返回true,没有匹配结果就返回false,执行过程与exec是一样的。相当于 (p.exec(s) != null)。
    3. RegExp的lastIndex属性在有g标识符,且在exec和test方法中是有效的,其他地方是无效的。
  • 相关阅读:
    20145202马超《网络对抗》Exp9*_* Web安全基础实践
    20145202马超《java》【课堂实验】P98测试
    20145202马超 2016-2017-2 《Java程序设计》第11周学习总结
    20145202马超《网络对抗》Exp8 Web基础
    20145202马超 2016-2017-2 《Java程序设计》第三次实验
    20145202马超 2016-2017-2 《Java程序设计》第10周学习总结
    20145202马超《网络对抗》Exp7 网络欺诈技术防范
    20145202马超 2016-2017-2 《Java程序设计》第二次实验
    20145202马超 2016-2017-2 《Java程序设计》第9周学习总结
    20145202马超《网络对抗》Exp6 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/zhaoran/p/2854852.html
Copyright © 2011-2022 走看看