详解JS正则replace的使用方法


Posted in Javascript onMarch 06, 2016

在讲replace的高级应用之前,我们先简单梳理一下JS正则中的几个重要的知识点,以帮助你对基础知识的回顾,然后再讲解JS正则表达式在replace中的使用,以及常见的几个经典案例。 

一、正则表达式的创建

JS正则的创建有两种方式: new RegExp() 和 直接字面量。

//使用RegExp对象创建
var regObj = new RegExp("(^\s+)|(\s+$)","g");

//使用直接字面量创建
var regStr = /(^\s+)|(\s+$)/g;

其中 g 表示全文匹配,与之相关的还有 i 和m,i 表示匹配时忽略大小写,m 表示多行匹配,如果多个条件同时使用时,则写成:gmi 

二、()、[]、{} 的区别

() 的作用是提取匹配的字符串。表达式中有几个()就会得到几个相应的匹配字符串。比如 (\s+) 表示连续空格的字符串。

[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示字符文本要匹配英文字符和数字。

{}一般用来表示匹配的长度,比如 \d{3} 表示匹配三个空格,\d[1,3]表示匹配1~3个空格。

三、^ 和 $

^ 匹配一个字符串的开头,比如 (^a) 就是匹配以字母a开头的字符串

$ 匹配一个字符串的结尾,比如 (b$) 就是匹配以字母b结尾的字符串

^ 还有另个一个作用就是取反,比如[^xyz] 表示匹配的字符串不包含xyz

需要注意的是:如果^出现在[]中一般表示取反,而出现在其他地方则是匹配字符串的开头

四、\d  \s  \w  .

\d 匹配一个非负整数, 等价于 [0-9]

\s 匹配一个空白字符

\w 匹配一个英文字母或数字,等价于[0-9a-zA-Z]

.   匹配除换行符以外的任意字符,等价于[^\n]

五、* + ?

* 表示匹配前面元素0次或多次,比如 (\s*) 就是匹配0个或多个空格

+ 表示匹配前面元素1次或多次,比如 (\d+) 就是匹配由至少1个整数组成的字符串

? 表示匹配前面元素0次或1次,相当于{0,1} ,比如(\w?) 就是匹配最多由1个字母或数字组成的字符串

六、test 、match

前面的大都是JS正则表达式的语法,而test则是用来检测字符串是否匹配某一个正则表达式,如果匹配就会返回true,反之则返回false

/\d+/.test("123") ; //true

/\d+/.test("abc") ; //false

match是获取正则匹配到的结果,以数组的形式返回

"186a619b28".match(/\d+/g); // ["186","619","28"] 

以上基本上是我经常用到的基础知识,不是很全面,不常用的就没有列出来,因为列出来也只是摆设,反而混淆主次!

七、replace

replace 本身是JavaScript字符串对象的一个方法,它允许接收两个参数:

replace([RegExp|String],[String|Function])
第1个参数可以是一个普通的字符串或是一个正则表达式

第2个参数可以是一个普通的字符串或是一个回调函数

如果第1个参数是RegExp, JS会先提取RegExp匹配出的结果,然后用第2个参数逐一替换匹配出的结果

如果第2个参数是回调函数,每匹配到一个结果就回调一次,每次回调都会传递以下参数:

result: 本次匹配到的结果

$1,...$9: 正则表达式中有几个(),就会传递几个参数,$1~$9分别代表本次匹配中每个()提取的结果,最多9个

offset:记录本次匹配的开始位置

source:接受匹配的原始字符串

以下是replace和JS正则搭配使用的几个常见经典案例: 

(1)实现字符串的trim函数,去除字符串两边的空格

String.prototype.trim = function(){

  //方式一:将匹配到的每一个结果都用""替换
  return this.replace(/(^\s+)|(\s+$)/g,function(){
    return "";
  });

  //方式二:和方式一的原理相同
  return this.replace(/(^\s+)|(\s+$)/g,'');
};

^\s+ 表示以空格开头的连续空白字符,\s+$ 表示以空格结尾的连续空白字符,加上() 就是将匹配到的结果提取出来,由于是 | 的关系,因此这个表达式最多会match到两个结果集,然后执行两次替换:

String.prototype.trim = function(){
  /**
   * @param rs:匹配结果
   * @param $1:第1个()提取结果
   * @param $2:第2个()提取结果
   * @param offset:匹配开始位置
   * @param source:原始字符串
   */
  this.replace(/(^\s+)|(\s+$)/g,function(rs,$1,$2,offset,source){
    //arguments中的每个元素对应一个参数
    console.log(arguments);
  });
};

" abcd ".trim();

输出结果:

[" ", " ", undefined, 0, " abcd "] //第1次匹配结果
[" ", undefined, " ", 5, " abcd "] //第2次匹配结果

(2)提取浏览器url中的参数名和参数值,生成一个key/value的对象

function getUrlParamObj(){
  var obj = {};
  //获取url的参数部分
  var params = window.location.search.substr(1);
  //[^&=]+ 表示不含&或=的连续字符,加上()就是提取对应字符串
  params.replace(/([^&=]+)=([^&=]*)/gi,function(rs,$1,$2){
    obj[$1] = $2;
  });

  return obj;
}

/([^&=]+)=([^&=]*)/gi 每次匹配到的都是一个完整key/value,形如 xxxx=xxx, 每当匹配到一个这样的结果时就执行回调,并传递匹配到的key和value,对应到$1和$2

(3)在字符串指定位置插入新字符串

String.prototype.insetAt = function(str,offset){

  //使用RegExp()构造函数创建正则表达式
  var regx = new RegExp("(.{"+offset+"})");

  return this.replace(regx,"$1"+str);
};

"abcd".insetAt('xyz',2); //在b和c之间插入xyz
>> "abxyzcd"

当offset=2时,正则表达式为:(^.{2})  .表示除\n之外的任意字符,后面加{2} 就是匹配以数字或字母组成的前两个连续字符,加()就会将匹配到的结果提取出来,然后通过replace将匹配到的结果替换为新的字符串,形如:结果=结果+str

(4) 将手机号12988886666转化成129 8888 6666

function telFormat(tel){

  tel = String(tel);

  //方式一
  return tel.replace(/(\d{3})(\d{4})(\d{4})/,function (rs,$1,$2,$3){
    return $1+" "+$2+" "+$3
  });

  //方式二
  return tel.replace(/(\d{3})(\d{4})(\d{4})/,"$1 $2 $3");
}

(\d{3}\d{4}\d{4}) 可以匹配完整的手机号,并分别提取前3位、4-7位和8-11位,"$1 $2 $3" 是在三个结果集中间加空格组成新的字符串,然后替换完整的手机号。

 (5) 实现函数escapeHtml,将<, >, &, " 进行转义

function escapeHtml(str) {
  //匹配< > " &
  return str.replace(/[<>"&]/g, function(rs) {
    switch (rs) {
      case "<":
        return "<";
      case ">":
        return ">";
      case "&":
        return "&";
      case "\"":
        return """;
    }
  });
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
清华大学出版的事半功倍系列 javascript全部源代码
May 04 Javascript
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
JS实现商品倒计时实现代码
May 03 Javascript
JavaScript获取路径设计源码
May 22 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
微信小程序中顶部导航栏的实现代码
Mar 30 Javascript
详解vue-admin和后端(flask)分离结合的例子
Feb 12 Javascript
vue mounted组件的使用
Jun 18 Javascript
详解vue挂载到dom上会发生什么
Jan 20 Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 Javascript
关于vue的列表图片选中打钩操作
Sep 09 Javascript
浅谈javascript中的call、apply、bind
Mar 06 #Javascript
一波JavaScript日期判断脚本分享
Mar 06 #Javascript
Node.js程序中的本地文件操作用法小结
Mar 06 #Javascript
JavaScript实现数据类型的相互转换
Mar 06 #Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 #Javascript
javascript实现label标签跳出循环操作
Mar 06 #Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 #Javascript
You might like
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
python程序变成软件的实操方法
2019/06/24 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
中医学专业自荐信范文
2014/04/01 职场文书
煤矿安全生产标语
2014/06/06 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS