zoukankan      html  css  js  c++  java
  • javascript的replace之正则表达式的浅析

    在javascript中,字符串的replace方法可以指定替换某些字符串。

    1、直接替换字符串

    "yy/MM/dd".replace("yy","2017");//替换后,原字符串变为2017/MM/dd

    这是直接指定将原字符串中的yy替换为2017。

    2、指定用函数返回值替换原指定字符串

    "yy/MM/dd".replace("yy",function(){return "2017";});//替换后,原字符串变为2017/MM/dd

    这是用函数返回值2017替换原字符串中的yy。

    3、用正则表达式指定需要被替换的源字符串

    "yy/MM/dd".replace(/yy/,"2017");

    看了上面最简单的,咱来一个比较复杂的。看下面的代码:

    Date.prototype.format = function(e) {
        var t = this,
        n = Date._formators;
        return n || (Date._formators = n = {
            y: function(e, t) {
                return e = e.getFullYear(),
                e < 0 ? "BC" + -e: t < 3 && e < 3e3 ? e % 100 : e
            },
            M: function(e) {
                return e.getMonth() + 1
            },
            d: function(e) {
                return e.getDate()
            },
            H: function(e) {
                return e.getHours()
            },
            m: function(e) {
                return e.getMinutes()
            },
            s: function(e) {
                return e.getSeconds()
            },
            e: function(e, t) {
                return (t === 1 ? "": t === 2 ? "周": "星期") + [t === 2 ? "日": "天", "一", "二", "三", "四", "五", "六"][e.getDay()]
            }
        }), //这个逗号是用来干啥的?为何括号之间会有这个逗号?
        (e || "yyyy/MM/dd HH:mm:ss").replace(/(w)1*/g,
        function(e, r) {//这个function是怎么来的
            if (r in n) {
                r = "" + n[r](t, e.length);
                while (r.length < e.length) r = "0" + r;
                e = r
            }
            return e
        })
    }
    

    上面这块代码对于新手来说,看着比较复杂,为啥括号之间会有逗号?为啥正则表达式(w)后会有1*?replace函数的第二个参数function(e,r)是怎么来的,为何这个function会有两个参数,这两个参数到底是什么意思?估计这些是新手最想问的。别急,接下来会一一讲解这些问题。

    一、括号之间为何会有逗号?

    这个属于逗号运算符。逗号运算符的的运算规则是自左向右运算,并返回最后一个表达式的值。

    如:var data=(x=2,x*3,x*5);

    上面这个表达式中,最先计算括号里面的值。括号里面的运算规则就是根据逗号运算符的规则去计算的,自左向右计算。首先计算x=2,第二个参数为6,第三个参数为10。data就是最后的一个参数值10。

    二、正则表达式(w)后面的1*是什么意思?

    1表示重复正则第一个圆括号内匹配到的内容,2表示重复正则第二个圆括号内匹配到的内容,如果有嵌套的圆括号,顺序是按左括号的次序计算的。星号*是匹配零个或多个。

    即"yy/MM/dd".replace(/(w)/,"1"),这个w首先匹配字符y,则最终的结果为"1y/MM/dd",如果是"yy/MM/dd".replace(/(w)1/,"1"),则最终的结果是"11/MM/dd",1就是多匹配一个(w)这个参数。按照这样来看,则"ybyb/MM/dd".replace(/(w)(w)12/,"2")的结果为"2/MM/dd"。

    三、replace函数的第二个参数function(e,r)是怎么来的,为何这个function会有两个参数,这两个参数到底是什么意思?

    这个函数应该是replace函数里面自带的,但是需要外面传一个实体方法进去。e传入的参数值为整个匹配的结果,如:yyyy。r传入的参数为(w)匹配的结果,如:y。如果在正则表达式后有g的话,那就是对整个字符串进行匹配并替换,有多少个匹配就循环多少次替换操作。如下面的代码所示:

    var obj={
        y:1,
        M:2,
        d:3
    };
    var source="yyyy/MM/dd".replace(/(w)1*/g,function(word,element){
        if(element in obj){
            word=obj[element].toString();
        }
        return word;
    });
    document.write(source);
    
    //对正则表达式进行了循环匹配,所以结果为:1/2/3
    

      

  • 相关阅读:
    glib 库 hash table 使用
    git 使用
    centos6.5 下安装 sqlplus
    Oracle tns 协议
    unix环境高级编程附录 B 通用代码
    centos6.5安装gtk开发环境
    linux 下定位程序假死
    Kotlin与Android SDK 集成(KAD 05)
    Kotlin的android扩展:对findViewById说再见(KAD 04)
    Kotlin类:功能更强、而更简洁(KAD 03)
  • 原文地址:https://www.cnblogs.com/williamwsj/p/6727841.html
Copyright © 2011-2022 走看看