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)\1\2/,"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

  

时间: 2024-08-26 09:45:10

javascript的replace之正则表达式的浅析的相关文章

JavaScript基础知识梳理----正则表达式

JavaScript基础知识梳理----正则表达式 1.创建 方式:---字面量:var 变量名=/表达式/模式修饰符 ---构造函数:var 变量名=new RegExp(“表达式”,“模式修饰符”) 说明: 表达式 单个字符和数字 . 匹配除换行符之外的任意字符 [a-z0-9] 匹配方括号中的任意字符 [^a-z0-9] 匹配不在方括号中的任意字符 \d 匹配数字 \D 匹配非数字 \w 匹配字母 \W 匹配非字母 空白字符 \0 匹配null字符 \b 匹配空格符 \f 匹配进纸符 \n

JavaScript:学习笔记(3)——正则表达式的应用

JavaScript:正则表达式的应用 应用正则表达式对象RegExp 创建正则表达式 JavaScript中使用RegExp对象来表述一个正则表达式.使用正则表达式之前首先要创建一个RegExp对象: var oRexp = new RegExp(pattern,[flag]); 说明: pattern:为必选项,表示以字符串格式表示的正则表达式. flag:为可选项,是匹配选项,可用值如下:  修饰符 描述 i 执行对大小写不敏感的匹配. g 执行全局匹配(查找所有匹配而非在找到第一个匹配后

JavaScript验证邮箱的正则表达式

用JavaScript验证邮箱的正则表达式时,一般比较常用的是用以下两种: var pattern = /^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/; var pattern = ^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$; 但是有时也会碰到像这种邮件:[email protected] 格式的邮件,这样便验证不了了.其实只要将第一个稍微改一下便可以了: va

关于javaScript注册事件传递参数的浅析

最近这半年作为一个java 程序员,我写的javaScript代码都快比java代码多了,前段时间是给某银行做一个柜员管控系统,在柜员授权这一块功能上,由于柜员的授权需要考虑各方面的因素,比如机构权限.柜员类型权限.岗位权限,业务权限等等,并且要对这些权限要做多次的交集或者并集处理,页面上不得不用许多的javascript来进行控制.造成了这一功能模块的实现上javaScript代码比java代码负责的情况. 而现在又要给某银行开发一个保管箱管理系统,其核心功能块保管箱座管理以及保管箱管理,为实

JavaScript中replace()方法的第二个参数解析

语法 string.replace(searchvalue,newvalue) 参数值 searchvalue 必须.规定子字符串或要替换的模式的 RegExp 对象.请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. newvalue 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返回值 String 一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的. 第一个参数searchv

JavaScript中String对象的match()、replace() 配合正则表达式使用

正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时,match()返回null,replace()返回原字符串. 正则表达式的模板对象 //标准写法 regexp = new RegExp(pattern[, flag]); pattern: 模板的用法是关键,也是本章的主要内容. flag: "i"(ignore)."g&quo

javascript基础知识之正则表达式(regular expression)

一种字符串匹配的模式,用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等.注意:在javascript中正则表达式也是一种对象1:创建正则表达式两种方式:隐式创建(文字量方法)和显示创建(使用构造函数)eg:文字量方法:var regExp = /pattern/flags;将文字量的正则表达式赋值给一个变量,包含在两个斜杠之间的一个或多个字符,在后一个斜杠的后面,可以指定一个或多个选项.var regExp1 = /abc/;var regExp2 = /a

JavaScript 中常用的 正则表达式

这编文章我来整理了一些在 javascript 中常用的正则式希望能给大家带来一些开发的灵感 //校验是否全由数字组成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) return false return true } 匹配中文字符的正则表达式: [u4e00-u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的

JavaScript 表单验证正则表达式大全

JavaScript验证正则表达式大全,搜集最全的JavaScript验证正则表达式,开始查看吧,这里的都是正则表达式的例子 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:< (S*?)[^>]*>.*?