Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.split,带“";[^a-zA-Z0-9]&x2B&引用;仍将空格显示为单词_Java_Regex_String_Inverted Index - Fatal编程技术网

Java String.split,带“";[^a-zA-Z0-9]&x2B&引用;仍将空格显示为单词

Java String.split,带“";[^a-zA-Z0-9]&x2B&引用;仍将空格显示为单词,java,regex,string,inverted-index,Java,Regex,String,Inverted Index,我遇到了一个程序的问题,该程序在Java中为给定文档创建单词到频率的映射。当我把所有的单词都打印出来时,我仍然认为“”是一个“单词” 以下是解释代码: String delimiters = "[^a-zA-Z0-9]+"; String[] words; SortedSet<String> allWords = new TreeSet<String>(); Map<String, Map<String, Integer>> wordMap = n

我遇到了一个程序的问题,该程序在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());
}
这个空白怎么显示出来的? 谢谢


ps如果您想看到完整的代码,这里是

,它不是一个空格,而是一个空字符串。 当文件中有空行时会发生这种情况

做这样的事

words = "".split(delimiters);

结果是一个数组有一个元素,该元素是空字符串。

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

做这样的事

words = "".split(delimiters);

结果数组中有一个元素,而该元素是空字符串。

@SotiriosDelimanolis除小写和大写字母和数字外的所有内容意思不是,不是空格,是空字符串。在(int k=0;k之后,{只要把
放在(words[k].length==0)继续;
每个认为索蒂里奥斯的评论有用的人都缺乏对正则表达式的理解。@SeanBright我想他们误读了这个问题,并假设它是在问为什么
[^a-zA-Z0-9]+
匹配的是空白。但不管怎样,这都不是一个有用的注释,因为使用
^
实际上不是问题。@SotiriosDelimanolis除了小写和大写字母和数字之外的所有内容都是不匹配的。这不是空格,而是空字符串。
for之后(int k=0;k
如果(单词[k].length==0)继续,就把
放进去;
每个认为索蒂里奥斯的评论有用的人都缺乏对正则表达式的理解。@SeanBright我想他们误读了这个问题,并认为它是在问为什么
[^a-zA-Z0-9]+
匹配的是空格。但不管怎样,这都不是一个有用的注释,因为使用
^
实际上不是问题所在。所以我应该先检查line==“”是否?不,在使用
words
中的每个单词之前,您应该检查它是否为空。
String.split()
将返回一个数组,该数组可以将空字符串作为一个或多个元素(如果一行中有两个字符与
分隔符相匹配),您可以这样做,或者,在处理完所有行后,只需从映射中删除空字符串键。仅为空格(或仅为“-delimeters”)的行也将具有
“”
空字符串匹配。只需在循环中添加一个对“”的检查将更有效,您将其描述为“对于所有单词,将单词添加到所有单词集和单词映射”。此外,您不应该执行
\word.length()==0
”。等于(word)
,而不是
==word
@SeanBright-他不会得到在分隔符之间,因为拆分匹配正则表达式末尾的“+”。因此,我应该首先检查line==”?否,在对
单词进行任何操作之前,您应该检查
单词中的每个单词是否为空。
字符串。split()
将返回一个数组,该数组可以将空字符串作为一个或多个元素(如果一行中有两个字符与您的
分隔符相匹配
),您可以这样做,或者,在处理完所有行后,只需从映射中删除空字符串键。仅为空格(或仅为“-delimeters”)的行也将有一个
空字符串匹配。只需添加对“”的检查将更有效在您描述为“for all words”的循环中,将单词添加到allWords集合和wordMap。此外,您不应该执行
\word.length()==0
”。equals(word)
,而不是
”==word
@SeanBright-由于拆分匹配正则表达式末尾的“+”,他将不会在分隔符之间获得“”。