正则表达式懒惰贪婪和replace函数
最近项目中一个简单的需求是,要把如下格式的一段文字
粗暴解决方法恩,这是个简单的问题,安排一个刚来没多久的小伙伴来做吧,结果他的代码是这样的 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} 第二个正则表达式第一个表达式的问题在哪儿呢,这要从正则表达式的懒惰与贪婪说起,下面是相关的解释:
由此可以看出本例中,使用了贪婪模式,所以匹配出来的结果是这样的: {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... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |