javascript replace方法与正则表达式


Posted in Javascript onFebruary 19, 2008

作者: hezhiwu5@163.com 
<script language="javascript">
var stringObj="终古人民共和国,终古人民";

//替换错别字“终古”为“中国”
//并返回替换后的新字符
//原字符串stringObj的值没有改变
var newstr=stringObj.replace("终古","中国"); 
alert(newstr);
</script>
比我聪明的你,看完上面的例子之后,会发现第二个错别字“终古”并没有被替换成“中国”,我们可以执行二次replace方法把第二个错别字“终古”也替换掉,程序经过改进之后如下:
<script language="javascript">
var stringObj="终古人民共和国,终古人民";

//替换错别字“终古”为“中国”
//并返回替换后的新字符
//原字符串stringObj的值没有改变
var newstr=stringObj.replace("终古","中国"); 

newstr=newstr.replace("终古","中国"); 
alert(newstr);
</script>
我们可以仔细的想一下,如果有N的N次方个错别字,是不是也要执行N的N次方replace方法来替换掉错别字呢??呵,不用怕,有了正则表达式之后不用一个错别字要执行一次replace方法。。程序经过改进之后的代码如下
<script language="javascript">
var reg=new RegExp("终古","g"); //创建正则RegExp对象
var stringObj="终古人民共和国,终古人民";
var newstr=stringObj.replace(reg,"中国"); 
alert(newstr);
</script>

上面讲的是replace方法最简单的应用,不知道大家有没有看懂??下面开始讲稍微复杂一点的应用。。

大家在一些网站上搜索文章的时候,会发现这么一个现象,就是搜索的关键字会高亮改变颜色显示出来??这是怎么实现的呢??其实我们可以用正则表达式来实现,具体怎么样实现呢?简单的原理请看下面的代码
<script language="javascript">
var str="中华人民共和国,中华人民共和国";
var newstr=str.replace(/(人)/g,"<font color=red>$1</font>");
document.write(newstr);
</script>
上面的程序缺少互动性,我们再改进一下程序,实现可以自主输入要查找的字符
<script language="javascript">
var s=prompt("请输入在查找的字符","人");
var reg=new RegExp("("+s+")","g");
var str="中华人民共和国,中华人民共和国";
var newstr=str.replace(reg,"<font color=red>$1</font>");
document.write(newstr);
</script>

可能大家都会对$1这个特殊字符表示什么意思不是很理解,其实$1表示的就是左边表达式中括号内的字符,即第一个子匹配,同理可得$2表示第二个子匹配。。什么是子匹配呢??通俗点讲,就是左边每一个括号是第一个字匹配,第二个括号是第二个子匹配。。

 当我们要把查找到的字符进行运算的时候,怎么样实现呢??在实现之前,我们先讲一下怎么样获取某一个函数的参数。。在函数Function的内部,有一个arguments集合,这个集合存储了当前函数的所有参数,通过arguments可以获取到函数的所有参数,为了大家理解,请看下面的代码
<script language="javascript">
function test()
{
alert("参数个数:"+arguments.length);
alert("每一个参数的值:"+arguments[0]);
alert("第二个参数的值"+arguments[1]);
//可以用for循环读取所有的参数
}

test("aa","bb","cc"); 
</script>
看懂上面的程序之后,我们再来看下面一个有趣的程序
<script language="javascript">
var reg=new RegExp("\\d","g");
var str="abd1afa4sdf";
str.replace(reg,function(){alert(arguments.length);});
</script>

我们惊奇的发现,匿名函数竟然被执行了二次,并且在函数里还带有三个参数,为什么会执行二次呢??这个很容易想到,因为我们写的正则表达式是匹配单个数字的,而被检测的字符串刚好也有二个数字,故匿名函数被执行了二次。。在匿名函数内部的那三个参数到底是什么内容呢??为了弄清这个问题,我们看下面的代码。
<script language="javascript">
function test()
{
for(var i=0;i<arguments.length;i++)
{
alert("第"+(i+1)+"个参数的值:"+arguments[i]);
}

}
var reg=new RegExp("\\d","g");
var str="abd1afa4sdf";
str.replace(reg,test);
</script>

经过观察我们发现,第一个参数表示匹配到的字符,第二个参数表示匹配时的字符最小索引位置(RegExp.index),第三个参数表示被匹配的字符串(RegExp.input)。其实这些参数的个数,还会随着子匹配的变多而变多的。弄清这些问题之后,我们可以用另外的一种写法
<script language="javascript">
function test($1)
{
return "<font color='red'>"+$1+"</font>"
}
var s=prompt("请输入在查找的字符","人");
var reg=new RegExp("("+s+")","g");
var str="中华人民共和国,中华人民共和国";
var newstr=str.replace(reg,test);
document.write(newstr);
</script>

看了上面的程序,原来可以对匹配到的字符为所欲为。下面简单举一个应用的例子
<script language="javascript">
var str="他今年22岁,她今年20岁,他的爸爸今年45岁,她的爸爸今年44岁,一共有4人"
function test($1)
{
var gyear=(new Date()).getYear()-parseInt($1)+1;
return $1+"("+gyear+"年出生)";
}
var reg=new RegExp("(\\d+)岁","g");
var newstr=str.replace(reg,test);
alert(str);
alert(newstr);
</script>

Javascript 相关文章推荐
splice slice区别
Oct 09 Javascript
JavaScript入门教程(5) js Screen屏幕对象
Jan 31 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
深入理解Javascript作用域与变量提升
Dec 09 Javascript
用jQuery toggleClass 实现鼠标移上变色
May 14 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
js密码强度校验
Nov 10 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
解决layui弹框失效的问题
Sep 09 Javascript
浅谈javascript事件环微任务和宏任务队列原理
Sep 12 Javascript
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
window.addeventjs事件驱动函数集合addEvent等
Feb 19 #Javascript
setAttribute 与 class冲突解决
Feb 17 #Javascript
setInterval 和 setTimeout会产生内存溢出
Feb 15 #Javascript
一个js封装的不错的选项卡效果代码
Feb 15 #Javascript
ImageFlow可鼠标控制图片滚动
Jan 30 #Javascript
北京奥运官方网站幻灯切换效果flash版打包下载
Jan 30 #Javascript
Javascript优化技巧(文件瘦身篇)
Jan 28 #Javascript
You might like
PHP 采集获取指定网址的内容
2010/01/05 PHP
PHP可变函数的使用详解
2013/06/14 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
Python中分数的相关使用教程
2015/03/30 Python
Python 3中的yield from语法详解
2017/01/18 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
python如何实现word批量转HTML
2020/09/30 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
致短跑运动员广播稿
2014/01/09 职场文书
趣味运动会策划方案
2014/06/02 职场文书
学校师德师风整改方案
2014/10/28 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书