2015-10-12 25 views
1

考虑以下字符串:Java的String修复收缩

"...Cant you, because I cant, I just CANT." 

一个如何去增加在cant所有实例的',同时仍保留资本?

"...Can't you, because I can't, I just CAN'T." 

这是我到目前为止。它的工作原理,但似乎不必要 复杂:

public static String fix(String line) { 
    if (line == null || line.isEmpty()) { 
     return line; 
    } 

    StringBuilder builder = new StringBuilder(); 
    String[] split = line.split(" "); 

    for (String word : split) { 
     if (word.replaceAll("\\p{P}", "").equalsIgnoreCase("cant")) { // remove punctuation 
      while (word.matches("^\\p{P}.*$")) { // starts with punctuation 
       builder.append(word.charAt(0)); 
       word = word.substring(1); 
      } 
      builder.append(word.substring(0, 3)); // can 
      builder.append("'");     // ' 
      builder.append(word.substring(3)); // t 
     } else { 
      builder.append(word); 
     } 

     builder.append(" "); 
    } 

    return builder.toString().trim(); 
} 
+0

是什么让你觉得这个解决方案很慢?你有没有试过计时?我运行它似乎足够快。 – azurefrog

+0

我只是觉得这么简单的任务太多了。从它的外观来看,正则表达式是解决这个问题的最佳解决方案。编辑:在原始帖子中将“缓慢”改为“复杂”:) –

回答

3

不区分大小写的正则表达式替换捕捉组对整条线路应该会更快:

public static String fix(String line) { 
    if (line == null) { 
     return null; 
    } 
    return line.replaceAll("(?i)\\b(can)(t)\\b", "$1'$2"); 
} 
+1

以几秒秒为单位击败我:) +1 – sam

0

问问自己,你的算法,其步骤是真的需要。最后,你是只有寻找所有出现的字符串“斜”(在这种情况下并不重要)。那么,你为什么要分裂线。你为什么要匹配东西?