【别出心裁】用正则表达式处理字符串,一行代码完成一道麻烦的编程题

本文主要是介绍【别出心裁】用正则表达式处理字符串,一行代码完成一道麻烦的编程题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编程题:
给定一串字符串,要求对该字符串处理为:
连续三个相同的,比如AAA变成AA
连续两对相同的,比如AABB变成AAB

(为防止我表达不当,或者您审题失误,这里做一下解释:AAA代表的三个一样的样式,不是说从一堆字符串中找到“AAA”然后转变为“AA”,那太简单了。这里的AAA可以是“aaa”,也可以是“bbb”,更可以是“zzz”等等。同理,AABB也不是代表“AABB”)

常规思路:
对字符串挨个判断,然后符合AAA和AABB样式的,进行相应的处理:
大致这样:
下面这个解法,大致的思路是:
将字符串遍历,然后每个字符和后面的两个字符比较,如果一样,代表是AAA样式;
然后再和后面三个字符比较,如果和第二个一样,和第三个不一样,并且第三个和第四个一样,那么就是符合AABB样式,然后最后再对这些符合条件的字符串处理成AA样式和AAB样式。
中间因为穿插一些分支结构以及判断flag,让代码阅读比较费劲,这里不推荐阅读,只是了解这个思路,知道这个解法比较麻烦即可。
然后才能更能体会到文末那个“一行”代码的解法的“别出心裁”。

public class ScanString {public String scan(String word){boolean flag = true;while(flag){if(word.length()>2){StringBuilder stringBuilder = new StringBuilder(word);int n = 0;int m = 0;boolean flag1 = false;for(int i =0;i<word.length() - 2;i++){//取AAAif(String.valueOf(word.charAt(i)).equals(String.valuesOf(word.charAt(i+1))) && String.valueOf(word.charAt(i)).equals(String.valueOf(word.charAt(i+2)))){n = i;flag1 = true;}}boolean flag2 = false;for(int i =0;i<word.length() - 3;i++){//取AABBif(String.valueOf(word.charAt(i)).equals(String.valueOf(word.charAt(i +1))) && !String.valueOf(word.charAt(i+1)).equals(String.valueOf(word.charAt(i+2))) && String.valueOf(word.charAt(i+2)).equals(String.valueOf(word.charAt(i+3)))){m = i+2;flag2 = true;}}if(n!=0){stringBuilder.deleteCharAt(n);}if(m!=0){stringBuilder.deleteCharAt(m);}word = stringBuilder.toString();if(!flag1 && !flag2){flag = false;}}else{flag = false;}}return word;}}

上面就是比较简单的思路,就是利用循环,不断的判断,判断出AAA以及AABB的,然后修改成AA以及AAB。
但是可以看出,上面的代码很长一段,并且阅读起来很费劲。
当然你可能有更多好的方法,可以让上面的代码,变成更少的行数,并且更容易阅读,但是如果用正则表达式呢?
用正则表达式,只需要一行:

public class ScanString{public void scan(String word){//只需下面一行word.replaceAll("(.)\\1\\1","$1$1").replaceAll("(.)\\1(.)\\2","$1$1$2");}
}

这种解决方式,确实很别出心裁,一般遇到字符串处理的时候,大部分都是各种逻辑判断加分支等,很难想到用正则表达式来做这个。
毕竟正则表达式在大多数时候,都是用来限制用户输入了。

下面解释一下上面的正则表达式:
首先是(.)这个东西是干嘛的呢?
我们知道.在正则表达式中,就是匹配任意字符的意思。
至于外面的括号,就是把这个看成一个“组”
后面的\\1又代表什么呢?
我们前面用括号分了一个组,这个\\1就是为了获得这个组匹配出的字符,换个词就是,捕获第一个组匹配出的字符。
那么$1又代表什么呢?
这个代表将你前面捕获的字符,拿过来。
所以我们因为(.)任意匹配到一个字符“c“,然后我们后面跟着连续两个\\1将这个正则表达式,动态的变成了”ccc“,自然就会去匹配到”ccc“的字符串。
然后我们通过$1$1,将我们要替换的字符串,动态的变成了”cc“,自然就实现了从”ccc“到”cc“的转变。

第二个同理,只不过\\2就是第二个组的意思,也就是第二个(.),如果将第二个正则表达式的\\2变成\\1就相当于匹配AABA的样式了。
至于$2自然也是同理。

这篇关于【别出心裁】用正则表达式处理字符串,一行代码完成一道麻烦的编程题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/279165

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。