详解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中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
Apr 15 Javascript
jQuery中slideUp()方法用法分析
Dec 24 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
基于canvas实现的绚丽圆圈效果完整实例
Jan 26 Javascript
只需五句话搞定JavaScript作用域(经典)
Jul 26 Javascript
js中Number数字数值运算后值不对的解决方法
Feb 28 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
Mar 03 Javascript
浅谈Webpack 是如何加载模块的
May 24 Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
Dec 11 jQuery
Javascript执行流程细节原理解析
May 14 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
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
javascript 写类方式之十
2009/07/05 Javascript
javascript工具库代码
2012/03/29 Javascript
jquery等待效果示例
2014/05/01 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
vue界面发送表情的实现代码
2020/09/11 Javascript
Python压缩和解压缩zip文件
2015/02/14 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
创业计划实施的7大步骤
2014/02/05 职场文书
社区义诊活动总结
2014/04/30 职场文书
学校德育工作总结2015
2015/05/11 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
Pandas-DataFrame知识点汇总
2022/03/16 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js
Python 统计序列中元素的出现频度
2022/04/26 Python