前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式懒惰贪婪和replace函数

正则表达式懒惰贪婪和replace函数

作者头像
用户3158888
发布2019-05-28 14:34:48
8100
发布2019-05-28 14:34:48
举报

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

粗暴解决方法

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

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

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

第一个正则表达式

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

代码语言:javascript
复制
var matchs = text.match(/\{.*\}/g);
for(var i = 0;i < matchs.length; i ++){
   text = text.replace(matchs[i],"{"+(i+1)+"}")
}

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

代码语言:javascript
复制
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。这被称为贪婪匹配。 有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

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

代码语言:javascript
复制
{111}{bbb}{111}

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

代码语言:javascript
复制
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的第二个参数可以指定函数的功能来实现,代码少了很多,如下:

代码语言:javascript
复制
var text = "aaa{111}bbb{111}";
var index = 1;
text = text.replace(/\{.*?\}/g,function(){
  return "{" + (index ++) + "}"
})
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 粗暴解决方法
  • 第一个正则表达式
  • 第二个正则表达式
  • replace函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档