正则表达式懒惰贪婪和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)

相关推荐

  • (转载)Jpa配置一对多关系

    (转载)Jpa配置一对多关系链接: https://www.cnblogs.com/a-small-lyf/p/10699326.html 在网上查了很多关于jpa的一对多表关联的操作,踩了很多坑,今天终于解决了 下面上一下我…

    2023-02-26
    147
  • MySQL 数据库优化,看这篇就够了

    MySQL 数据库优化,看这篇就够了数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷. 1、优化一览…

    2023-03-26
    141
  • [踩坑总结] HttpClient默认重试策略不处理SocketTimeoutException

    [踩坑总结] HttpClient默认重试策略不处理SocketTimeoutExceptionhttpClient默认重试策略DefaultHttpRequestRetryHandler针对连接超时和获取数据超时并不会重试,需要自定义重试策略。

    2023-07-23
    118
  • 数据库常见面试题及答案_数据库面试题基础知识

    数据库常见面试题及答案_数据库面试题基础知识1.事务四大特性原子性,要么执行,要么不执行隔离性,所有操作全部执行完以前,其它会话不能看到过程一致性,事务前后,数据总额一致持久性,一旦事务提交,对数据的改变就是永久的2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别脏读:事务B读取事务A还没有提交的数据不可重复读:两次事务读的数据不一致幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看…

    2023-04-02
    164
  • 用Python创建PostgreSQL数据表

    用Python创建PostgreSQL数据表a href=”https://beian.miit.gov.cn/”苏ICP备号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-09-07
    5
  • PHP操作Elasticsearch7.6

    PHP操作Elasticsearch7.6首先打开Elasticsearch官网了解对应编程语言的API https://www.elastic.co/guide/en/elasticsearch/client/index.html 点击 P

    2023-03-29
    156
  • Python参数定义

    Python参数定义函数或方法中经常需要传递参数,Python提供了多种类型的参数来实现参数的传递,以及多种不同的方法来定义函数的参数。在Python中,参数的定义可以分为两类:位置参数和关键字参数。

    2024-01-08
    111
  • Python中namedtuple的使用

    Python中namedtuple的使用在Python中,有时需要自定义简单但是有名字的记录类型,如果使用字典或普通元组,通常会显得有点笨重。此时,strongnamedtuple/strong就成为了一个很好的选择。namedtuple是Python标准库collections中的一个函数,用于创建和实例化类似于元组的对象,但这些对象有名称,可以像字典一样通过名称来访问字段。namedtuple相当于一个轻量级的类定义器,它本质上是一个Python类,可以像其他类一样继承、实例化、序列化和扩展。

    2024-09-05
    7

发表回复

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