使用Java模式匹配四个重复字母的正则表达式

17

我希望能够匹配像aaaa,aaaad,adjjjjk这样的字符。使用([a-z])\1+可以匹配重复的字符,但我无法解决四个字母的情况。


嘿,伙计们,很酷的答案,但我有一个问题: "ffffffff".matches("([a-z])\1{3,}") = true "fffffasdf".matches("([a-z])\1{3,}") = false "asdffffffasdf".matches("([a-z])\1{3,}") = false对于后两个,我该怎么办? - Anonymous user
4个回答

25
你想匹配一个字符,然后将该字符重复三次:
([a-z])\1{3}

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


更新:它没有按照你的期望工作的原因是,你正在使用需要字符串与正则表达式完全匹配的方法matches,而不仅仅是包含正则表达式。要检查是否包含,您应该使用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

18

如果不了解有限重复语法,您自己的问题解决能力应该会引导您到达这个:

([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!
//                         ^^              ^^

如果您正在尝试匹配一个字符串,其中您要查找的字符串恰好在行尾字符之前,上面的模式将无法匹配。(我是通过艰难的方式学到的!)您可以使用'"asdfffffffffasf".matches(".([a-z])\1{3,}(?s).")',其中'(?s)'触发了行尾字符的匹配。 - seinecle
最好找到重复的字符。 - Brownsoo Han
我已经寻找这个东西两个小时了。非常感谢。 - Parth Bhoiwala

6

您可以在某些字符后面加上{n}来匹配它n次,例如:

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

3

预定义重复的一般正则表达式模式为{4}

因此,这里的([a-z])\1{3}应该匹配您的4个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接