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

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

编程题:
给定一串字符串,要求对该字符串处理为:
连续三个相同的,比如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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav