JavaScript正则表达式小知识

本文介绍了JavaScript中正则表达式的使用方法,包括RegExp对象的应用及如何利用正则表达式进行DOM元素class属性的添加与移除。通过具体示例展示了正则表达式的灵活性和强大的文本处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要有JavaScript和Regular Expressions基本知识

1、Regular Expression Object
正则表达式对象:本对象包含正则表达式模式以及表明如何应用模式的标志。

2、RegExp Object
RegExp对象:保存有关正则表达式模式匹配信息的固有全局对象。

这两个是不一样的,具体的参见[url="http://msdn.microsoft.com/en-us/library/htbw4ywd(v=VS.85).aspx"]参考手册[/url]
http://msdn.microsoft.com/en-us/library/htbw4ywd(v=VS.85).aspx
这个是Microsoft官方的参考手册
暂时没有发现MDC等其它地方的参考手册有明确说明这一点
https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
但是[url="https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions"]这里[/url]面提到了这类特性的用法

下面看两段小小的代码,也是从百度页面上抠下来的,做了些小的调整

addClassName = function(d, f) {

// ...
// 判断这个DOM对象是否存在,不存在就直接返回,这些代码都被我省掉了


// 先把这个DOM对象的class属性的值按space截开转成字符串数组b
// c是一个去前后空格的函数,简单测试情况下也可以去掉
var b = d.className.split(" "), c = trim;


if(!new RegExp("(^|\\s{1,})" + c(f) + "(\\s{1,}|$)").test(d.className)) {

d.className=c(b.concat(f).join(" "));

}

};


这个函数看名字就很清楚了,是给页面上的对象的class属性添加值,因为class属性可以有多个用space隔开的值
只是在添加值之前做了很多判断和处理,我们只看正则表达式相关的
也就是那个if语句内的情况
把传进来的属性值和已经存在的class属性值相比较,如果不存在就添加到尾部,如果存在就什么都不做
它通过new创建的正则表达式对象一共可以侦测出class属性值是类似以下的这几种情况,也满足了功能需求

red noborder flashing
noborder flashing
red noborder
noborder


也就是当我们传入"noborder"这个值的时候,如果原来class属性值已经是类似上面这四种情况都可以被侦测出来


再来看另外的一段代码,这段代码跟上面是相反的,就是把class属性中某个指定的值去掉(如果已经存在这个指定的值的话)

removeClassName = function(d, f) {

// ...
// 判断这个DOM对象是否存在,不存在就直接返回,这些代码都被我省掉了


var c = trim, re = new RegExp("(^|\\s{1,})" + c(f) + "(\\s{1,}|$)", "g");

d.className = c(d.className.replace(re, "$2"));

};


替换函数是查找到了就替换,并把它替换成$2,这个$2就是RegExp全局对象的一个属性,它始终存储的是最后一次匹配的结果,一共可以保存$1到$9共9个子匹配的结果
如果没有子匹配,默认的$n值就是空字符串
比如我们这里的re正则表达式对象只有两个子匹配,那么就只可能有$1和$2有值,其它都是空串
这里我们用$2来替换,实际$2返回的可能只有任何的空白字符或者字符串结尾,可以用charCodeAt函数将其unicode编码打印出来观察

通过例子来看
如果:
d.className = "red noborder flashing"
f = "noborder"
最后替换的结果就是"red flashing"

如果:
d.className = "noborder flashing"
f = "noborder"
最后替换的结果就是" flashing"

如果:
d.className = "red noborder"
f = "noborder"
最后替换的结果就是"red"

如果:
d.className = "noborder"
f = "noborder"
最后替换的结果就是""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值