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

正则表达式懒惰贪婪和replace函数最近项目中一个简单的需求是,要把如下格式的一段文字 abc{1220}cde{2222}def{cccc} 替换成 abc{1}cde{2}def{3} 也就是把{}匹配到的内容,用匹配的索引替代掉。 恩,这是个简单的问题,安排一个刚来没多久的小伙伴来做吧,结果他的代码是这样的…

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

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年前看过的一个文档,里面的内容讲的挺详尽的。

deerchao.net/tutorials/r…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13058.html

(0)

相关推荐

  • 编译工具:这些IDE和代码编辑器你用过几个?[通俗易懂]

    编译工具:这些IDE和代码编辑器你用过几个?[通俗易懂]简单的说,IDE 是一组集成在一起的工具:文本编辑器、编译器、构建或进行集成、调试等。尽管微软是一家市值数十亿美元的公司,并且追求完美,但微软还

    2022-12-14
    412
  • Python编写脚本的入门教程

    Python编写脚本的入门教程Python是一种强大、高层次且易于使用的解释型编程语言,用于快速开发应用程序。在日常的工作和生活中,编写Python脚本可以为我们的工作流程节省大量时间。然而,许多人可能不知道如何开始编写Python脚本,本文将介绍Python编写脚本的一些入门教程。

    2024-06-04
    55
  • Python TTK Represents:构建高效GUI界面的利器

    Python TTK Represents:构建高效GUI界面的利器Python 作为一种强大的编程语言,拥有广泛的程序库和工具,使其成为日益流行的编程语言之一。它有非常丰富的 GUI 库,使用这些库可以快速地构建出美观、高效的图形用户界面(GUI)应用程序。而 Tkinter 是 Python 的标准 GUI 库,很多 Python 开发者都使用它来创建 GUI 应用程序。但是,一些 Python 开发者并不喜欢 Tkinter 的样式,因此 Tkinter 的一种改进模块—ttk 库应运而生。

    2024-01-14
    94
  • 【2019年8月版】OCP 071认证考试原题-第40题「建议收藏」

    【2019年8月版】OCP 071认证考试原题-第40题「建议收藏」Choose two. Which two statements are true about single row functions? A) CONCAT : can be used to co…

    2022-12-27
    163
  • 如何正确发音Scrapy

    如何正确发音ScrapyScrapy是一个功能强大的Python网络爬虫框架,可用于从静态和动态网站上提取结构化数据。

    2024-05-05
    65
  • python将c,python将成绩从大到小排序「终于解决」

    python将c,python将成绩从大到小排序「终于解决」要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的Extending embedding厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在Python Programming On Win32书中找到了教程。

    2023-08-24
    120
  • MySQL简单实现多字段模糊查询【转】「终于解决」

    MySQL简单实现多字段模糊查询【转】「终于解决」我所做的商城项目前些时提了新需求,要求前台搜索商品除了能通过商品名称搜索到以外,还可以通过别个信息搜索,比如:商品编号、详情内容描述等等,类似于全文搜索了。我首先想到的就是lucene,但是对代码这样

    2023-02-15
    145
  • Python变量类型判断方法介绍

    Python变量类型判断方法介绍Python是一种动态语言,不要求在变量定义时指定数据类型。Python能够自动根据变量的值来推断出变量的类型。

    2024-08-29
    24

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注