我这才发现,原来我根本看不懂Java的正则表达式!

正则表达式 (\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+ 表示匹配重复的字符。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/115114711
今日推荐