正则表达式,用于使用 Java 模式匹配字符串中的四个重复字母

2022-09-02 23:08:37

我想匹配像aaaa,aaaad,adjjjjk这样的东西。像([a-z])\1+这样的东西被用来匹配重复的字符,但我无法弄清楚四个字母。


答案 1

您想要匹配单个字符,然后该字符再重复三次:

([a-z])\1{3}

注意:在Java中,您需要对正则表达式中的反斜杠进行转义。


更新:它没有执行您想要的操作的原因是,您正在使用方法匹配,该方法要求字符串与正则表达式完全匹配,而不仅仅是它包含正则表达式。要检查包含,您应该改用 Matcher 类。下面是一些示例代码:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class Program
{
    public static void main(String[] args)
    {
        Pattern pattern = Pattern.compile("([a-z])\\1{3}");
        Matcher matcher = pattern.matcher("asdffffffasdf");
        System.out.println(matcher.find());
    }
}

结果:

true

答案 2

不了解有限重复语法,你自己的问题解决技能应该会让你明白这一点:

([a-z])\1\1\1

显然它并不漂亮,但是:

  • 它的工作原理
  • 它锻炼你自己的解决问题的能力
  • 它可能会引导您更深入地理解概念
    • 在这种情况下,知道有限重复语法的去糖形式

我有一个顾虑:

  • "ffffffff".matches("([a-z])\\1{3,}") = true
  • "fffffasdf".matches("([a-z])\\1{3,}") = false
  • "asdffffffasdf".matches("([a-z])\\1{3,}") = false

我能为倒数第二名做些什么?

问题是在Java中,需要匹配整个字符串;就好像图案被 和 包围一样。matches^$

不幸的是没有,但你总是可以使用这个技巧来包围模式:String.containsPattern(String regex).*

"asdfffffffffasf".matches(".*([a-z])\\1{3,}.*") // true!
//                         ^^              ^^