Java中的Trim()不按我期望的方式工作?

时间:2012-09-09 19:29:45

标签: java regex substring trim

  

可能重复:
  Query about the trim() method in Java

我正在解析网站的用户名和其他信息,每个信息都有一堆空格(但是在单词之间有空格)。 例如:“Bob the Builder”或“Sam the welder”。空格数量因名称而异。我想我只是使用.trim(),因为我之前使用过它。 但是,它给了我麻烦。我的代码如下所示:

for (int i = 0; i < splitSource3.size(); i++) {
            splitSource3.set(i, splitSource3.get(i).trim());
}

结果是一样的;最后没有删除空格。 提前感谢您的出色答案!

更新:

完整代码有点复杂,因为首先解析出HTML标记。它完全是这样的:

for (String s : splitSource2) {
        if (s.length() > "<td class=\"dddefault\">".length() && s.substring(0, "<td class=\"dddefault\">".length()).equals("<td class=\"dddefault\">")) {
                splitSource3.add(s.substring("<td class=\"dddefault\">".length()));
        }
}

System.out.println("\n");
    for (int i = 0; i < splitSource3.size(); i++) {
            splitSource3.set(i, splitSource3.get(i).substring(0, splitSource3.get(i).length() - 5));
            splitSource3.set(i, splitSource3.get(i).trim());
            System.out.println(i + ": " + splitSource3.get(i));
    }
}

更新:

冷静下来。我从来没有说过Java的错误,我从来没有说过这是一个错误或破坏或任何东西。我只是说我遇到了麻烦并发布了我的代码供您协作并帮助解决我的问题。注意短语“我的问题”而不是“java的问题”。我实际上打印了代码

System.out.println(i + ": " + splitSource3.get(i) + "*");

之后每个循环中的

这就是我知道我遇到问题的方法。 顺便说一下,问题仍然没有解决。

更新:

示例输出(减去单引号):

'0: Olin D. Kirkland                                          '
'1: Sophomore                                          '
'2: Someplace, Virginia  12345<br />VA SomeCity<br />'
'3: Undergraduate                                          '

编辑 OP在Query about the trim() method in Java重新提出了他的问题,其中发现问题是与String.trim()不匹配的Unicode空白字符。

2 个答案:

答案 0 :(得分:0)

对我来说没有问题。

这里你的代码有点重构,并且(可能)更易读:

final String openingTag = "<td class=\"dddefault\">";
final String closingTag = "</td>";
List<String> splitSource2 = new ArrayList<String>();
splitSource2.add(openingTag + "Bob the Builder " + closingTag);
splitSource2.add(openingTag + "Sam the welder " + closingTag);
for (String string : splitSource2) {
    System.out.println("|" + string + "|");
}
List<String> splitSource3 = new ArrayList<String>();
for (String s : splitSource2) {
    if (s.length() > openingTag.length() && s.startsWith(openingTag)) {
        String nameWithoutOpeningTag = s.substring(openingTag.length());
        splitSource3.add(nameWithoutOpeningTag);
    }
}

System.out.println("\n");
for (int i = 0; i < splitSource3.size(); i++) {
    String name = splitSource3.get(i);
    int closingTagBegin = splitSource3.get(i).length() - closingTag.length();
    String nameWithoutClosingTag = name.substring(0, closingTagBegin);
    String nameTrimmed = nameWithoutClosingTag.trim();
    splitSource3.set(i, nameTrimmed);
    System.out.println("|" + splitSource3.get(i) + "|");
}

我知道这不是一个真正的答案,但是我不能发表评论,这段代码作为评论是不合适的,所以我做了一个答案,以便Olin Kirkland可以检查他的代码。

答案 1 :(得分:0)

当我在屏幕抓取项目上工作时,我曾经遇到过这种问题。关键是有时下载的HTML源包含不可打印的字符,这些字符也是非空白字符。这些很难复制粘贴到浏览器。我认为这可能发生在你身上。

如果我的假设是正确的,那么你有两个选择:

  1. 使用二进制阅读器并找出这些字符是什么 - 并使用String.replace()删除它们; E.g:

    private static void cutCharacters(String fromHtml) {
        String result = fromHtml;
        char[] problematicCharacters = {'\000', '\001', '\003'}; //this could be a private static final constant too
        for (char ch : problematicCharacters) {
            result = result.replace(ch, ""); //I know, it's dirty to modify an input parameter. But it will do as an example
        }
        return result;
    }
    
  2. 如果您在要解析的HTML中找到某种重复出现的模式,那么您可以使用正则表达式和子字符串来剪切不需要的部分。 E.g:

    private String getImportantParts(String fromHtml) {
        Pattern p = Pattern.compile("(\\w*\\s*)"); //this could be a private static final constant as well.
        Matcher m = p.matcher(fromHtml);
        StringBuilder buff = new StringBuilder();
        while (m.find()) {
            buff.append(m.group(1));
        }
        return buff.toString().trim();
    }