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源包含不可打印的字符,这些字符也是非空白字符。这些都很难复制粘贴到浏览器。我想这可能发生在你身上 如果我的假设是正确的,那么您有两个选择:
你有一个额外的括号。这是你的真实代码吗?如果没有,您可以发布您所拥有的内容。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();
}