Java文本匹配测试无输出问题排查:代码错误定位求助
代码无输出问题排查
你写的这段代码意图是从指定文档字符串中找出存在的目标短语,但运行后无输出,问题出在以下几个关键地方:
- 参数逻辑完全颠倒:
findPhrasesInDocument方法的业务逻辑搞反了——你在测试用例里把文档字符串作为第一个参数传入,但方法内部却用这个文档生成正则,去匹配文档本身,再遍历短语列表判断,这完全不符合“在文档中找短语”的需求。正确逻辑应该是遍历每个目标短语,检查它是否存在于文档中。 - 正则转义错误:Java字符串中反斜杠
\需要双重转义,你写的"\b"会被解析为退格字符,而非正则表达式中的单词边界\b,正确写法应为"\\b"。 - Matcher使用逻辑混乱:当前代码创建的Matcher是用文档匹配基于文档生成的正则,循环中重复调用
matcher.find()也会因为没有重置匹配位置导致逻辑错误,完全偏离了“检查短语是否在文档中”的目标。
修正后的代码(带单词边界校验)
@Test void justAnExample() { List<String> list = findPhrasesInDocument("some test located into long program", List.of("test", "into", "long program")); System.out.print(String.join("\n", list)); } List<String> findPhrasesInDocument(String document, List<String> phrases) { List<String> foundPhrases = new ArrayList<>(); for (String phrase : phrases) { // 修正转义问题,同时用Pattern.quote处理短语中的正则特殊字符 String regex = String.format("\\b%s\\b", Pattern.quote(phrase)); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(document); if (matcher.find()) { foundPhrases.add(phrase); } } return foundPhrases; }
简化版本(无需严格单词边界)
如果不需要限制短语必须是独立单词,直接用字符串包含判断即可,代码更简洁:
@Test void justAnExample() { List<String> list = findPhrasesInDocument("some test located into long program", List.of("test", "into", "long program")); System.out.print(String.join("\n", list)); } List<String> findPhrasesInDocument(String document, List<String> phrases) { List<String> foundPhrases = new ArrayList<>(); for (String phrase : phrases) { if (document.contains(phrase)) { foundPhrases.add(phrase); } } return foundPhrases; }
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

