-3

可能重复:
查询 Java 中的 trim() 方法

我正在解析站点的用户名和其他信息,每个站点后面都有一堆空格(但单词之间有空格)。例如:“Bob the Builder”或“Sam thewelder”。空格的数量因名称而异。我想我会使用 .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 中重新表述了他关于 Java 中的 trim() 方法的问题,其中发现问题是 Unicode 空白字符与String.trim().

4

2 回答 2

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 就可以检查他的代码。

于 2012-09-09T20:20:05.567 回答
0

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

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

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

    私人静态无效cutCharacters(字符串fromHtml){
        字符串结果 = fromHtml;
        char[] 有问题的Characters = {'\000', '\001', '\003'}; //这也可以是一个私有的静态最终常量
        for (char ch: 有问题的字符) {
            结果 = result.replace(ch, ""); //我知道,修改输入参数很脏。但它会作为一个例子
        }
        返回结果;
    }
    
  2. 如果您在要解析的 HTML 中发现某种重复出现的模式,那么您可以使用正则表达式和子字符串来删除不需要的部分。例如:

    私人字符串 getImportantParts(字符串 fromHtml){
        模式 p = Pattern.compile("(\\w*\\s*)"); //这也可以是一个私有的静态最终常量。
        匹配器 m = p.matcher(fromHtml);
        StringBuilder buff = new StringBuilder();
        而(m.find()){
            buff.append(m.group(1));
        }
        返回 buff.toString().trim();
    }
    
于 2012-09-26T06:04:25.750 回答