最近项目中一个简单的需求是,要把如下格式的一段文字

abc{1220}cde{2222}def{cccc}
替换成
abc{1}cde{2}def{3}
也就是把{}匹配到的内容,用匹配的索引替代掉。

粗暴解决方法

恩,这是个简单的问题,安排一个刚来没多久的小伙伴来做吧,结果他的代码是这样的

var left = "{",right = "}";
然后写代码自己一遍一遍的去找匹配的内容,具体代码我就不贴了

看到这个,我的内心是崩溃的。
你没有学过正则表达式吗? 他说学过。
他说学过,他竟然说学过。。。

第一个正则表达式

小伙伴从新从正则表达式的思路去解决,然后得出的是这样的一个正则表达式。

var matchs = text.match(/\{.*\}/g);
for(var i = 0;i < matchs.length; i ++){text = text.replace(matchs[i],"{"+(i+1)+"}")
}

然而结果并不对,结果是这样的:

var text = "aaa{111}{bbb}{111}";
var matchs = text.match(/\{.*\}/g);
for(var i = 0;i < matchs.length; i ++){text = text.replace(matchs[i],"{"+(i+1)+"}")
}
最终的结果是这样的:
aaa{1}

第二个正则表达式

第一个表达式的问题在哪儿呢,这要从正则表达式的懒惰与贪婪说起,下面是相关的解释:

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

由此可以看出本例中,使用了贪婪模式,所以匹配出来的结果是这样的:

{111}{bbb}{111}

要改进程序,只需要把贪婪模式改成懒惰模式即可,上面说过只需要在后面加一个问号?即可,所以改进的版本是这样的:

var text = "aaa{111}bbb{111}";
var matchs = text.match(/\{.*\}/g);
for(var i = 0;i < matchs.length; i ++){text = text.replace(matchs[i],"{"+(i+1)+"}")
}
最终结果是对的:
aaa{1}bbb{2}

replace函数

前面第二个正则表达式可以解决需求,但是代码比较长,事实上,可以直接使用replace的第二个参数可以指定函数的功能来实现,代码少了很多,如下:

var text = "aaa{111}bbb{111}";
var index = 1;
text = text.replace(/\{.*?\}/g,function(){return "{" + (index ++) + "}"
})

后续

当然本案例中的解决方案没有考虑括号不匹配的情况,相关情况更加复杂一点,自行思考。

有关正则表达式的学习,新人们可以参考我N年前看过的一个文档,里面的内容讲的挺详尽的。

http://deerchao.net/tutorials...

正则表达式懒惰贪婪和replace函数相关推荐

  1. pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)

    pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe) 目录

  2. pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe)

    pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe) 目录

  3. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换

    pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换 目录

  4. python replace函数_Python3 replace()函数使用方法

    描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次. 语法replace()方法语法: str.replac ...

  5. MySQL Replace()函数

    转载自  MySQL Replace()函数 MySQL REPLACE字符串函数简介 MySQL为您提供了一个有用的字符串函数REPLACE(),它允许您用新的字符串替换表的列中的字符串. REPL ...

  6. Python中replace()函数

    replace()函数 功能:类似正则表达式的sub()函数,使用新的字符串替换主串中的内容. 函数需要通过字符串来调用,replace(old, new, max)函数参数依次为: old表示主串中 ...

  7. python非贪婪匹配_Python中关于正则表达式非贪婪以及多行匹配功能详解

    这篇文章主要介绍了Python正则表达式非贪婪.多行匹配功能,结合实例形式分析了Python正则表达式中非贪婪及多行匹配功能的实现方法与相关注意事项,需要的朋友可以参考下 本文实例讲述了Python正 ...

  8. 彻底搞懂javascript中的replace函数

    javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...

  9. 缺陷修改实践——replace函数的运用|思考?

    目录 介绍 问题出现 问题分析 解决方法 优化 实现 总结 介绍 大家好,我是清风.今天给大家分享一个项目中遇到问题解决问题的案例,编程其实就是一个思考的过程,缺少思考就没有灵魂,遇到问题先静下心去思 ...

最新文章

  1. MySQL复制经常使用拓扑结构具体解释
  2. DockerSwarm 微服务部署
  3. SAP SD模块调研问卷
  4. 怎样用bootsrapcol-md来实现四分屏_用会议平板提升会议效率,做好这两点
  5. CentOS7 Firewall NAT 及端口映射
  6. 【Hihocoder - 1723】子树统计(线性基合并)
  7. LAMP环境搭建过程中出现的问题——基于VM虚拟CentOS-5.6
  8. C语言中static的用法
  9. 《和平精英》迎来史上最严封号:模拟器过检测、手机外设全部凉凉?
  10. Redis过期删除策略
  11. 怎样将生成的pdf文件转为eps文件
  12. mariadb mysql.sock_数据库缺少mysql.sock文件的解决办法
  13. setTimeout运行机制
  14. JAVA程序设计:在圆内随机生成点(LeetCode:478)
  15. html怎么设置div只读,html怎么设置只读状态
  16. 来把三子棋吗?创建属于你的三子棋。
  17. Android 中的 NDK 到底是什么?(详细解析+案例实战)
  18. c语言响铃编程,C语言C加加编程新手快速入门基础学习
  19. 格灵深瞳——人脸识别算法测试FRVT
  20. Sourcetree使用教程,拉取代码克隆、解决冲突、合并分支

热门文章

  1. SAP Business One 产品功能综述
  2. Windows phone 7更新已经支持复制/粘贴[有图有真相]
  3. 有感于“政府傍大款”----谈中小企业融资问题
  4. C#速成之一(Quick C#)
  5. 如何在CentOS 7上使用uWSGI和Nginx来运行Django应用程序
  6. JDBC编程专题4之JDBC驱动程序类型
  7. react-dnd中context丢失解决方法
  8. Dynamics 365 for CRM: Sitemap站点图的可视化编辑功能
  9. Android设计模式-观察者模式
  10. Mobile OpenCart 自适应主题模板 ABC-0074