• javascript 中几个与正则表达式相关的应用


    string 对象
    1、str.match(RegExp)
    在str中搜索匹配RegExp的字符串并保存在一个数组内返回,
    如果RegExp不是全局设置(/g),仅匹配一次

    ("abc112dwfwabcwef2abc3wfwabcasqf453abcqwf24j234h").match(/abc\d*/g);
    //结果
    ["abc112", "abc", "abc3", "abc", "abc"]

    该方法中,如果正则表达式不是全局匹配模式(g标记),第一个元素将是匹配的字符串,其余是正则中捕获的字符串,并且该数组具备2个属性:

    input 用于检测的字符串

    index 匹配的字符串在用于检测字符串中的开始位置。

    (关于这2个属性可以参考 RegExp.exec() 方法)

    match 方法的参数还可以是字符串,用于在字符串中查询是否包含某个字符串,如果过存在则返回包含该字符串的数组,返回的数组同样存在 index 和 input 属性

    var arr = 'asdadsdD0'.match('d');
    for( k in arr) console.log(k,arr[k]);
    
    输出:
    0 d 
    index 2 
    input asdadsdD0 

    2、str.search(regExp)
    返回符合匹配RegExp的第一个字符串的位置,如果没有匹配返回-1,全局标记没有意义,因为只匹配一次,

    该方法也忽略 regExp 的 lastIndex 属性,并且总是从字符串的开始进行检索。

    3、str.replace(RegExp,replaceText)
    将匹配RegExp 的字符串替换为replaceText,如果 RegExp 没有全局设置,只匹配一次,使用全局模式将替换所有匹配的字符串。
    如果RegExp 中使用了捕获分组匹配,则replaceText中的$具有特殊含义

        $1、$2、...、$99    //与 RegExp 中的第 1 到第 99 个子表达式相匹配的文本。
        $&             //  与 regexp 相匹配的子串。
        $`             //  位于匹配子串左侧的文本。
        $'             //  位于匹配子串右侧的文本。
        $$             //  匹配$符号自身。

    注意,你需要考虑RegExp中捕获分组的数量,如果你只设置了2个捕获,那$3将不再具有特殊含义

     ("123ab12c11d_4532").replace(/a(b\d*)c(\d*)d/,"$1@$2-") 
    //将得到:
     "123b12@11-_4532"


    4、str.replace(RegExp,function)
    str.replace 的第二个参数可以是函数,函数的返回值将作为匹配字符的替换内容,
    注意,如果要全局匹配RegExp仍然需要全局g标记。
    函数的参数依次是:
        匹配的字符串,
        配置的捕获子串(多个),
        匹配字符串的开始位置,
        用于匹配的原字符串
    注 意,请根据RegExp中捕获分组的设置数量来定义函数参数个数,如果参数太少将可能导致“匹配字符串的开始位置” 和 “用于匹配的原字符串” 不能在 参数中出现,当然也可以在函数内使用arguments对象解决这个问题,arguments(arguments.length-2) 就是匹配字符串 的开始位置,arguments(arguments.length-1) 就是 用于匹配的原字符串。

    var newStr = ("123ab12c11d_4532").replace(/a(b\d*)c(\d*)d/g,function(s,s1,s2,pos,oldStr){
        return "@"+s1+"@"+s2+"@";
    }) ;
    
    //将得到
    
    "123@b12@11@_4532"



    5、str.split(RegExp[,limit])
    将字符串str用符合匹配的字符串分割成数组,limit 可选,用于限定返回的数组长度

    ("ada2afa4fcas6afa").split(/\d/,3) // ["ada","afa","fcas"]


    6、RegExp.exec("str") 方法
        在str中查找匹配的字符串,注意,每次运行该方法只匹配一次,要匹配多个需要将RegExp设置为/g,并多次运行exec()方法,每次匹配返回值 result = RegExp.exec("str")
        result为一个数组,这个数组长度为1,数组元素为找到的匹配的子串,
        另外,这个数组被额外赋给了2 个属性:
            result.index 表示匹配的子串在原字符串的开始位置
            result.input 就是原字符串

    var result = (/\d/g).exec("13ghjk1g23kj13");
    console.log(result);// ["1", index: 0, input: "13ghjk1g23kj13"]
    console.log(result.constructor);//function Array() { [native code] }

        当再也无法找到符合匹配的子串时,返回 result = null,并设置 RegExp.lastIndex=0

        RegExp.lastIndex 是正则表达式的属性,表示当前将从字符串的哪个位置开始匹配,初始值为0。
        如果RegExp被设置为全局的(尤其是在IE8及以下的浏览器,因为这些浏览器即使正则表达式不是全局模式也不会重置 lastIndex 的值),在匹配一个字符串一次之后,使用同一个RegExp对一个新的字符串进行匹配请先手动设置 RegExp.lastIndex=0 

    如 果RegExp 不是全局匹配模式,在程序中又写了一个循环,根据返回值 result 来决定是否终止匹配,从而试图匹配完这个字符串,那么,只要有符合 匹配条件的子串,就必定造成死循环,因为非全局匹配只对字符串匹配一次,结果每次运行匹配操作都是匹配第一个子串,返回的 result 不为空,这是个 比较容易犯的错误。

        var str = "1Visit W3School, W3School is a place to study web technology.";
        var patt = new RegExp("W3School","g");
        var result;
    
        document.write(patt.lastIndex+"<br />");
         document.write("=====================================<br />");  
        while ((result = patt.exec(str)) != null)  {
          document.write(patt.lastIndex+"<br />");
          document.write(result.constructor.name+"<br />");
          document.write(result.length+"<br />");
          document.write(result[0]+"<br />");
          document.write(result.index+"<br />");
          document.write(result.input+"<br />");      
          document.write("=====================================<br />");  
         }
        document.write(patt.lastIndex+"<br />");
    
       // 运行结果:
        0
        =====================================
        15
        Array
        1
        W3School
        7
        1Visit W3School, W3School is a place to study web technology.
        =====================================
        25
        Array
        1
        W3School
        17
        1Visit W3School, W3School is a place to study web technology.
        =====================================
        0


    7、reg.test("str") 方法
     该方法与 reg.exec 类似,不同的是仅返回true或false
     reg.lastIndex 的含义是一样的(这是reg的属性,跟是使用test方法还是exec方法无关)
     如果同一个全局模式的 reg 先后使用了test方法和exec方法(尤其是在IE8及以下的浏览器,因为这些浏览器即使正则表达式不是全局模式也不会重置 lastIndex 的值),你可能需要手动设置 reg.lastIndex=0,这些方法是共享同一个RegExp对象的lastIndex 属性的

    var str = "1Visit W3School, W3School is a place to study web technology.";
    var patt = new RegExp("W3School","g");
    var result ;
    
    result = patt.test(str);   
    alert(result); //true
    result = patt.test(str);  
    alert(result); //true
    result = patt.test(str);  
    alert(result); //false

    IE9+ 、较新版本的 chrome、firefox 中 , str.match(reg) 执行完毕后,无论是否全局匹配,是否存在匹配结果 ,lastindex 被重置,reg.lastIndex = 0 ,IE8及IE8一下浏览器则是最后一次所匹配的字符串结束的位置+1(即使匹配出已经是字符串结尾也是+1)  。

    reg.test(str) 执行后,如果正则是非全局匹配的,lastindex 被重置, re.lastIndex  = 0,否则 re.lastIndex 为第一次匹配的字符串结束位置+1,
    但在 IE8 及以下,正则匹配执行后除非没有匹配结果,否则  re.lastIndex 是第一个匹配字符串的结尾字符的位置 +1(test 方法只匹配一次),即lastIndex 没有被重置,,IE9+ 虽然重置了reg.lastIndex ,但静态的 RegExp.lastIndex 仍然会被设置 。

    IE8 及IE8 以下的浏览器, RegExp 函数有一个静态属性 lastIndex ,他的值与最近运行的正则表达式的 lastIndex 的值相同,但是全局模式的正则表达式对象在进行多次的 test 或 exec 方法调用时,还是以 reg.lastIndex 来判断下一次匹配的搜索开始位置的:

    var reg = /\d/;
    var reg2 = /a/g;
    var str = "1a1d23asd7a123sa1sd";
    
    reg2.test(str);
    console.log(RegExp.lastIndex,'|' ,reg.lastIndex,'|',reg2.lastIndex);
    
    reg.test(str);
    console.log(RegExp.lastIndex,'|' ,reg.lastIndex,'|',reg2.lastIndex);
    
    reg2.test(str);
    console.log(RegExp.lastIndex,'|' ,reg.lastIndex,'|',reg2.lastIndex);

    IE 8下的执行结果:

    日志: 2|0|2 
    日志: 1|1|2 
    日志: 7|1|7 

    IE9 和IE10

     2|0|2 
     1|0|2 
     7|0|7 

    firefox 和 chrome:

    undefined | 0 | 2
    undefined | 0 | 2
    undefined | 0 | 7
  • 相关阅读:
    c语言 11
    c语言中atoi、atol、atof函数,字符串转换函数
    c语言中strncmp函数,函数原型,头文件
    c语言中strcmp函数, 函数原型、头文件
    c语言中strncat函数、函数原型、头文件
    c语言中strcat函数,函数原型、头文件
    c语言中strncp函数,函数原型、头文件
    c语言中strcpy函数,函数原型、头文件
    c语言 11-6
    tyvj2059 元芳看电影
  • 原文地址:https://www.cnblogs.com/ecalf/p/2790036.html
Copyright © 2020-2023  润新知