【问题标题】:Java String.split with "[^a-zA-Z0-9]+" still showing whitespace as a word带有“[^a-zA-Z0-9]+”的 Java String.split 仍将空格显示为单词
【发布时间】:2013-09-05 20:14:44
【问题描述】:

我在使用 Java 中为给定文档创建单词到频率图的程序时遇到问题。当我打印出所有单词时,我仍然将“”视为“单词”。

这里是转述的代码:

String delimiters = "[^a-zA-Z0-9]+";
String[] words;
SortedSet<String> allWords = new TreeSet<String>();
Map<String, Map<String, Integer>> wordMap = new HashMap<String, Map<String, Integer>>();

while ((line = bufferedReader.readLine()) != null) {
    words = line.split(delimiters);
    for all words add the word to the allWords set and the wordMap
}

for (String word : allWords) {
    System.out.println(word + " : " + wordMap.get(word).entrySet());
}

这是一些示例输出:

Time elapsed: 0.75 seconds.
 : [books/dickens.txt=7]       // WHAT ARE YOU?!?! How does this happen??!?!
10 : [books/dickens.txt=2]
11th : [books/dickens.txt=2]
12th : [books/dickens.txt=2]

这个空白是如何出现的? 谢谢

ps 如果你想在这里看到完整的代码是a link

【问题讨论】:

  • @SotiriosDelimanolis 除了大小写字母和数字之外的所有内容?? ^ 表示不是。
  • 不是空格,是空字符串。在for (int k = 0; k &lt; words.length; k++) { 之后只需输入if (words[k].length == 0) continue;
  • 每个将 Sotirios 的评论标记为有用的人都缺乏对正则表达式的理解。
  • @SeanBright 我认为他们误读了这个问题,并认为它在问为什么 [^a-zA-Z0-9]+ 匹配空白。但无论哪种方式,这都不是一个有用的评论,因为 ^ 的使用实际上并不是问题。

标签: java regex string inverted-index


【解决方案1】:

即不是空格是空字符串。 当文件中有空行时会发生这种情况。

做这样的事情

words = "".split(delimiters);

产生一个包含一个元素且该元素为空字符串的数组。

【讨论】:

  • 所以我应该先检查 line == " " 吗??
  • 不,你应该先检查words 中的每个单词是否为空,然后再对它进行任何操作。 String.split() 将返回一个数组,该数组可以将空字符串作为 1 个或多个元素(如果一行中有两个字符与 delimiters 匹配)
  • 您可以这样做,或者,在您处理完所有行之后,只需从地图中删除空字符串键。
  • 只有空格(或只有'分隔符')的行也将有一个 "" 空字符串匹配。在循环中添加对“”的检查会更有效,您将其描述为“对于所有单词将单词添加到 allWords 集和 wordMap”。另外,你不应该这样做\word.length() == 0"".equals(word),而不是"" == word
  • @SeanBright - 由于拆分匹配正则表达式末尾的“+”,他不会在分隔符之间获得“”。
猜你喜欢
  • 2012-03-26
  • 2015-01-07
  • 2021-11-09
  • 2015-02-08
  • 2011-11-09
  • 2010-12-11
  • 2011-06-08
  • 1970-01-01
  • 2019-05-03
相关资源
最近更新 更多