如何添加html标签,但仍然保持空间不变?

时间:2015-01-23 17:25:47

标签: java regex string algorithm data-structures

我正在处理来自http://www.glassdoor.com/Interview/Indeed-Software-Engineer-Intern-Interview-Questions-EI_IE100561.0,6_KO7,31.htm

的面试问题

我目前正在做的问题是“第二个问题是搜索字符串中的特定单词,并在单词的每个外观周围添加”< b>“”< \ b>“。

这是我的代码:

public class AddBsAround {
      public static void main(String[] args) {
          String testCase = "Don't   you love    it when you install all software and all programs";
           System.out.println(addBs(testCase, "all"));
      }
     public static String addBs(String sentence, String word) { 
          String result = "";
          String[] words = sentence.trim().split("\\s+");
           for(String wordInSentence: words) {
                  if(wordInSentence.equals(word)) {
                        result += "<b>" +word + "</b> ";
                  }  else {
                       result += wordInSentence + " "; 
                    }
            }
        return result;
      }
   }

代码基本上产生正确的输出;也就是说,当在测试用例中传递时,它会产生

  

Don't you love it when you install <b>all</b> software and <b>all</b> programs

,避免了原作者的错误,因为在“安装”中搜索“all”,他的代码会产生“安装”。

然而这些空间会成为一个问题吗?传入时

"Don't   you love    it "

,我的代码会产生“你不喜欢它”,或者基本上是句子之间只有一个空格。你们认为这是一个问题吗?我有点做,因为客户端可能不希望这种方法改变空格。会有解决方法吗?我觉得我需要使用正则表达式来分隔单词。

3 个答案:

答案 0 :(得分:1)

你可以在regex中使用lookarounds:

public static String addBs(String sentence, String word) { 
    String result = "";
    String[] words = sentence.split("(?<!\\s)(?=\\s)");
    for(String wordInSentence: words) {
        if(wordInSentence.trim().equals(word)) {
            result += "<b>" +word + "</b> ";
        }  else {
            result += wordInSentence + " "; 
        }
    }
    return result;
}

<强>输出:

  

Don't you love it when you install <b>all</b> software and <b>all</b> programs

(?<!\\s)负面后瞻,这意味着前面的字符不是空格而(?=\\s)正向前瞻,这意味着以下字符是一个空间。 See regex demo here

答案 1 :(得分:1)

而不是拆分\\s+,拆分\\s - 这样,它会拆分每一个空间而不是每一个空间,当你把它们放回去时,空间数量保留下来。不同之处在于+告诉正则表达式在一个或多个空格上分割,但没有它,它只是一个空格。

除此之外,我还建议您使用StringBuilder来加入字符串,因为它对于很长的字符串效率更高,而且您希望尽可能做到最好,对吗?

这只是一个字符的变化,但为了完整起见,这是你的新方法:

public static String addBs(String sentence, String word) { 
    StringBuilder result = new StringBuilder();
    String[] words = sentence.trim().split("\\s");
    for(String wordInSentence: words) {
      if(wordInSentence.equals(word)) {
        result.append("<b>").append(word).append("</b> ");
      }  else {
        result.append(wordInSentence).append(" "); 
      }
    }
    return result.toString();
  }
}

使用此代码的结果如下:

Don't   you love    it when you install <b>all</b> software and <b>all</b> programs

答案 2 :(得分:0)

正如其他人所说,使用单一空间进行拆分会更好。只是以不同的方式处理它,尝试Java的模式。

public static String addBs(String sentence, String word) { 
    Pattern pattern = Pattern.Compile(word);
    Matcher m = pattern.matcher(sentence);
    return(m.replaceAll("<b>" + word + "</b>"));
}