Java中String.equals方法失效问题求助(网页复制字符串场景)
问题分析与解决步骤
先给你梳理下两个核心问题:一是代码里的逻辑判断错误,二是网页复制字符串带来的「脏数据」干扰,咱们一步步解决。
1. 先Fix最明显的逻辑错误
你写的条件判断用了||(逻辑或),这会导致所有元素都会执行查询——因为一个字符串不可能同时等于"a"和"to",所以!equals("a") || !equals("to")永远为true。而且你还漏了判断"on"的条件,代码也少了闭合的大括号。
修正后的循环逻辑:
String garlic = "1 small garlic clove, finely grated on a microplane"; String[] queryArray = extract(garlic); for (int i = 0; i < queryArray.length; i++ ) { String item = queryArray[i]; // 用&&同时满足三个"不等于"的条件,才执行查询 if (!item.equals("a") && !item.equals("to") && !item.equals("on")) { performQuery(item); } }
2. 处理网页复制字符串的坑
网页复制的字符串大概率包含这些问题:
- 非标准空格:比如不间断空格
(Unicode编码160)、全角空格(12288),这些用\\s+分割可能不生效,或者分割后元素带隐形空格 - 标点粘连:比如例子里的
clove,,逗号和单词连在一起,导致你判断"a"/"to"/"on"时,可能出现类似"a,"的元素,自然匹配不上 - 大小写差异:网页里可能有大写的"A",和你判断的小写"a"不相等
优化你的extract方法,加入字符串清洗
public static String[] extract(String string) { try { // 步骤1:把所有非标准空格替换成普通空格 String cleaned = string.replaceAll("\\p{Zs}", " "); // 步骤2:去除单词前后的标点(逗号、句号、分号等),同时转成小写统一判断 cleaned = cleaned.replaceAll("([^a-zA-Z0-9\\s])", " ").toLowerCase(); // 步骤3:按任意空白字符分割 return cleaned.split("\\s+"); } catch (PatternSyntaxException ex) { ex.printStackTrace(); return new String[0]; // 返回空数组避免空指针异常 } }
如果想更精准提取单词(比如忽略数字、只保留纯字母单词),可以用正则匹配的方式:
public static List<String> extractCleanWords(String string) { List<String> result = new ArrayList<>(); // 匹配纯字母单词,自动忽略标点和数字 Pattern pattern = Pattern.compile("\\b([a-zA-Z]+)\\b"); Matcher matcher = pattern.matcher(string.toLowerCase()); while (matcher.find()) { result.add(matcher.group(1)); } return result; }
然后遍历这个List就行:
String garlic = "1 small garlic clove, finely grated on a microplane"; List<String> queryList = extractCleanWords(garlic); for (String item : queryList) { if (!item.equals("a") && !item.equals("to") && !item.equals("on")) { performQuery(item); } }
3. 排查隐藏字符的小技巧
如果还是有奇怪的匹配问题,可以打印每个元素的字符编码,看看是不是有隐形字符:
for (String item : queryArray) { System.out.println("元素内容: '" + item + "',长度: " + item.length()); // 打印每个字符的Unicode编码 for (char c : item.toCharArray()) { System.out.print((int)c + " "); } System.out.println(); }
比如普通空格是32,不间断空格是160,全角空格是12288,一眼就能发现问题。
内容的提问来源于stack exchange,提问作者JCG
相关产品推荐
相关产品推荐

