正则表达式重复的字符(\\ 1不起作用)

时间:2016-04-06 12:54:54

标签: java regex string repeat

我目前正试图在Java中创建一个正则表达式,如果输入字符串中存在任何重复的字符,则返回true,否则返回false,正则表达式尽可能短(对于代码高尔夫挑战)。我不是很擅长正则表达式,但我认为这样做可以解决问题:

(.)\\1

(.)是任何字符,\\1是对正则表达式第一部分中匹配项的引用。

但是,如果我尝试输入" 1223",它就无法运作:

public static void main(String[] a){
     System.out.println(java.util.regex.Pattern.matches("(.)\\1", "1223"));
}

由于22而我期待真实,因此返回false。

有没有人知道如何使用java.util.regex.Pattern.matches修正正则表达式,或更短的内容,因为它代码高尔夫? ;)

Here is an ideone for the test.

2 个答案:

答案 0 :(得分:3)

Pattern.matches(regex, sequence)返回整个字符串是否与regex对应,而不是存在匹配的子字符串。

对于您要做的事情,您可以做以下两件事之一:

  1. 使用正则表达式".*(.)\\1.*"代替
  2. 使用Matcher类:

    Matcher m = Pattern.compile(regex).matcher(sequence).find(); 
    int start = m.start();  
    int end = m.end();
    

答案 1 :(得分:3)

matches消耗整个字符串:首先.匹配" 1"然后\\1尝试匹配" 1"作为下一个角色,并失败。

您有两种选择:

  • 使用find
  • 将正则表达式更改为.*(.)\\1.*

说明:

第二个选项现在有效,因为.*将首先匹配整个字符串,然后它将无法匹配\\1,它会逐个字符地追溯char,直到.*匹配& #34; 1",然后(.)\\1将匹配" 22",最后的.*将与字符串的其余部分匹配。