【问题标题】:Testing String results which both contain \n测试字符串结果都包含 \n
【发布时间】:2018-04-16 19:55:26
【问题描述】:

所以我很快就想回答一个关于代码战的问题。代码挑战的目的是剥离一个字符串,从代码中删除所有 cmets。

所以我有这段代码,它会进行剥离并给出我期望的结果:

   public static String stripComments(String text, String[] commentSymbols) {

        boolean ignoreNext = false;
        StringBuilder noCommentString = new StringBuilder();
        StringBuilder currentLine = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            if (String.valueOf(c).equals("\n")) {
                currentLine.append("\\n");
                ignoreNext = false;
                noCommentString.append(currentLine.toString().trim());
                currentLine = new StringBuilder();
                continue;
            }
            if (!ignoreNext) {

                for (int j = 0; j < commentSymbols.length; j++) {
                    if (commentSymbols[j].equals(String.valueOf(c))) {
                        ignoreNext = true;
                        noCommentString.append(currentLine.toString().trim());
                        currentLine = new StringBuilder();
                    }
                }
                if (!ignoreNext) {
                    currentLine.append(c);
                }
            }
        }
        return noCommentString.toString();
    }

但是由于一些相当奇怪的原因,这个测试失败了:

   @Test
    public void stripComments() throws Exception {

        String expected = "apples, pears\ngrapes\nbananas";
        String actual =  StripComments.stripComments("apples, pears # and bananas\ngrapes\nbananas !apples", new String[]{"#", "!"});
        assertEquals(expected, actual);
    }

如果我要评估代码,实际的字符串是:

apples, pears\ngrapes\nbananas

当然你可以看到预期的字符串是:

apples, pears\ngrapes\nbananas

到底为什么会失败,我敢肯定这与一些奇怪的\n行为有关

【问题讨论】:

  • currentLine.append("\\n"); 听起来很阴暗。为什么要用文字 \n 替换合法的换行符(这是输出所期望的)?
  • 既然如此,为什么不直接在换行符处拆分并对结果列表进行操作?
  • 糖,我把它留在里面的原因是想弄糟结果
  • 有一个字符串列表@MadPhysicist

标签: java newline stringbuilder


【解决方案1】:

我认为您应该附加“\n”而不是“\\n”。这里不需要转义字符。 currentLine.toString().trim() 也会导致删除换行符,因此请避免使用它。而是尝试使用 currentLine.toString()。某些系统可能需要使用“\r\n”而不是“\n”。如果“\n”不适合你,试试这个。

【讨论】:

  • 太棒了,我永远不会猜到是 trim() 搞砸了,谢谢
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 2013-07-06
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多