有人可以解释String#replaceAll(..)方法的正则表达式部分吗?

时间:2014-02-03 20:03:10

标签: java regex string

//Its a question on replacement of duplicate characters

public class RemoveDuplicateChars {

    static String testcase1 = "DPMD Jayawardene";

    public static void main(String args[]){
        RemoveDuplicateChars testInstance= new RemoveDuplicateChars();
        String result = testInstance.remove(testcase1);
        System.out.println(result);

    }
    //write your code here
    public String remove(String str){
        return str.replaceAll("(.)(?=.*\\1)", "");//how this replacement working
    }       
}

2 个答案:

答案 0 :(得分:1)

从类的名称可以看出 - 它删除了在字符串中重复的字符。

击穿:
(.) - 代表任何字符,括号用于分组,因此我们稍后可以使用\1

引用它

(?=) - 预测

(?=.*\\1) - 我们期待着 .*消费任意数量的字符并查找我们的第一个字符\1

如果正则表达式是真实的,引用的字符将被替换为空字符串。

请参阅 Fiddle

答案 1 :(得分:1)

来自java.util.Pattern

  • (.):匹配捕获组中的任何字符(基本上是名为\1的变量)
  • (?=:零宽度正向前瞻(确保字符串的其余部分匹配)
    • .*任意数量的字符后跟
    • \\1抓获的小组

换句话说,它匹配后面也出现在字符串中的任何字符(即重复)。在Java中,这将是:

for(int i=0; i<str.length(); i++) { 
  char captured = str.charAt(i); // (.)
  if (str.substring(i+1).matches(".*" + captured))  { // (?=.*\1)
    // the char is a duplicate, replace it with "" 
  }
}