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

How to add the html tags but still keep the spaces intact?

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

的面试题

我现在做的题是 "The second question is searching a particular word in a string, and add "" "<\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

,避免了原作者的错误,在"install"中搜索"all",他的代码会产生"install"。

但是 space 会成为问题吗?当传入

"Don't   you love    it "

,我的代码将生成 "Don't you love it",或者基本上是单词之间只有一个 space 的句子。你们认为这是一个问题吗?我有点这样做,因为客户可能不希望这种方法改变 spaces。会有解决方法吗?我觉得我需要使用正则表达式来分隔单词。

您可以在正则表达式中使用环视:

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) 是一个 负后视 这意味着前面的字符不是 space 而 (?=\s) positive lookahead 这意味着后面的字符是 space。 See regex demo here.

不是在 \s+ 上拆分,而是在 \s 上拆分——那样的话,它会在每个 space 上拆分,而不是在每组上拆分,当你把它们放回去时一起,spaces 的数量被保留。区别在于 + 告诉正则表达式拆分一个或多个 space,但没有它,它就是一个。

除此之外,我还建议使用 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

正如其他人所建议的那样,使用单个 space 拆分会更好。只是为了以不同的方式处理它,尝试 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>"));
}