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

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

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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地