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

Java中的Trim()没有按我期望的方式工作?,java,regex,substring,trim,Java,Regex,Substring,Trim,可能重复: 我正在解析一个站点的用户名和其他信息,每个站点后面都有一堆空格(但单词之间有空格)。 例如:“建筑工人鲍勃”或“焊工山姆”。空格的数量因名称而异。我想我应该使用.trim(),因为我以前用过这个。 然而,这给我带来了麻烦。我的代码如下所示: for (int i = 0; i < splitSource3.size(); i++) { splitSource3.set(i, splitSource3.get(i).trim()); } for (St

可能重复:

我正在解析一个站点的用户名和其他信息,每个站点后面都有一堆空格(但单词之间有空格)。 例如:“建筑工人鲍勃”或“焊工山姆”。空格的数量因名称而异。我想我应该使用.trim(),因为我以前用过这个。 然而,这给我带来了麻烦。我的代码如下所示:

for (int i = 0; i < splitSource3.size(); i++) {
            splitSource3.set(i, splitSource3.get(i).trim());
}
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));
    }
}
在一个for-each循环中

这就是我知道自己有问题的原因。 顺便说一下,这个问题还没有解决

更新:

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

'0:Olin D.Kirkland'
‘1:大二’
“2:弗吉尼亚州某地12345
弗吉尼亚州某地
” “3:本科”

EDITOP在重新表述了他的问题,发现问题是Unicode空白字符与
字符串不匹配。trim()
对我来说没有问题

在这里,您的代码经过了一些重构,并且(可能)可读性更好:

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) + "|");
}
最终字符串openingTag=”“;
最终字符串closingTag=“”;
List splitSource2=new ArrayList();
splitSource2.add(openingTag+“Bob the Builder”+closingTag);
splitSource2.添加(openingTag+“Sam焊工”+closingTag);
for(字符串:splitSource2){
System.out.println(“|”+字符串+“|”);
}
List splitSource3=new ArrayList();
用于(字符串s:splitSource2){
if(s.length()>openingTag.length()和&s.startsWith(openingTag)){
字符串名称without openingTag=s.substring(openingTag.length());
splitSource3.add(name不带openingtag);
}
}
System.out.println(“\n”);
对于(int i=0;i


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

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

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

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

    私有静态无效字符(HTML中的字符串){ 字符串结果=fromHtml; char[]problematicCharacters={'\000','\001','\003'};//这也可能是一个私有静态最终常量 for(字符ch:Problematicscharacters){ result=result.replace(ch,“”;//我知道,修改输入参数是肮脏的,但作为一个例子就可以了 } 返回结果; }
  • 如果在HTML中发现某种重复出现的模式需要解析,那么可以使用正则表达式和子字符串来剪切不需要的部分。例如:

    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(); } 私有字符串getImportantParts(字符串来自HTML){ Pattern p=Pattern.compile(“(\\w*\\s*)”;//这也可以是一个私有的静态最终常量。 Matcher m=p.Matcher(fromHtml); StringBuilder buff=新的StringBuilder(); while(m.find()){ buff.append(m.group(1)); } 返回buff.toString().trim(); }

  • 你有一个额外的括号。这是你的真实代码吗?如果没有,您可以发布您所拥有的内容。trim()没有损坏。您是否打印出使用前和使用后的结果?您是否仔细阅读了文档,以查看文档是否记录了实际执行所需的操作?请向我们展示splitSource3列表中某个值的示例以及该值在控制台中的输出。问问您自己,您发现未记录的bug与您误解工具的使用或代码中有未发现的bug的几率有多大?我们都使用了
    trim()。如果可能的话,我想赌一大笔钱,这里的错误不是用java。@奥林克兰德,我会考虑删除或重新整理评论气垫船的评论;他的观点是正确的。看,事情是这样的。我不是从硬代码中抓取“建筑工人鲍勃”和“焊工山姆”。我从HTML中获取它,这就是为什么这很困难(我想)。我不知道你的答案应该是什么。这些openingTag和closingTag变量是什么??我像那样从网站上抓取东西,并试图摆脱它…?我只是创建了标签,使它更可读。但无论如何,你在另一篇文章中得到了答案^^我的答案只是为了让它更可读和可执行。问题是Unicode“不间断空格”字符,答案是
    
    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) + "|");
    }
    
    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; } 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(); }