正则表达式 (\w)((?=\1\1\1)(\1))+
(\w)((?=\1\1\1)(\1))+
表达式说明:
(\w)
表示匹配并捕获一个单词字符,将匹配内容作为第一个捕获组
(?=\1\1\1)
这是一个零宽断言+反向引用,表示之后应该紧接着连续出现三次第一个捕获组匹配到的字符串,但这三次匹配不占位置,不会吃掉匹配到的字符,所以叫零宽;
(\1)
反向引用,表示接下来应该匹配到第一个捕获组中的内容;
最后 (?=\1\1\1)(\1)+
用括号()
括起来并且跟上一个 +
号表示这种模式应该至少匹配一次。
例如有字符串: aaaaab,匹配过程是:
①指针从第1个字符开始匹配,\w匹配到字符a,捕获组1的内容是a,指针移动到第2个字符位置;
②(?=\1\1\1)检查第2个字符开始是否紧跟着三个a,发现成立,但不匹配这三个字符,指针仍然停留在第2个字符位置;
③(\1)检查第2个字符是否是a,发现成立,匹配这个字符,指针移动到第3个字符位置;
重复②和③,直到其中一者不能匹配为止。返回之前已匹配到的所有字符。最终的匹配结果就是aaa。
LC:自动校对程序
package com.lightsword.leetcoding
/**
* @author: Jack
* 2021/3/19 上午1:45
*
* 我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发现拼写错误的捷径:
1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello
2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello
3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC
我特喵是个天才!我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!
……
万万没想到,我被开除了,临走时老板对我说: “做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我现在整个人红红火火恍恍惚惚的……
请听题:请实现大锤的自动校对程序
*/
class 自动校对程序
fun main() {
val a1 = "helllooworrlld".rep()
val a2 = "helloooooaabbbbbbb".rep()
val a3 = "AABBCC".rep()
println(a1)
println(a2)
println(a3)
}
fun String.rep(): String {
// \1表示.匹配到的第一个字符
// \2表示.匹配到的第二个字符
// (.)\1+表示匹配重复的字符
return this.replace(Regex("(.)\\1+"), "$1$1")
.replace(Regex("(.)\\1(.)\\2"), "$1$1$2")
}
//helloworrld
//helloaab
//AABCC
其中, (.)\1+
表示匹配重复的字符。
网友评论