使用行编号复杂进行文本搜索

时间:2014-07-01 06:42:48

标签: java regex string full-text-search text-files

编辑: 感谢dawww,问题在于编码,我将其更改为UFT-8,现在该程序运行良好。只是有点慢。

我迫切需要帮助。

问题:

我有一个TreeSet,其中包含我从文本中取出的单词,它们都是小写并且遵循此正则表达式(“[^ a-zA-Z]”),我需要的是逐字逐句地比较TreeSet带有我从中获取的文本并获取每个单词出现的行号,将它们存储到ArrayList中并返回。

我有以下代码:

public ArrayList<Integer> search(String word, String book) throws FileNotFoundException, IOException{
    FileReader path = new FileReader(book);
    LineNumberReader read = new LineNumberReader(path);
    ArrayList<Integer> lines = new ArrayList<>();
    String line;

    for(line = read.readLine(); line != null; line = read.readLine()){
        if(line.toLowerCase().contains(word)){
            lines.add(read.getLineNumber());
        }
    }
    return lines;
}

我们的想法是将搜索方法的返回值作为一个值用于Map&gt; (每个单词和行)

像这样:

for(String s : words){
        map.put(s, search(s , book));
    }

单词是TreeSet,其中包含我从文本中获取的字符串(来自Lewis Carroll的爱丽丝梦游仙境)。

代码不起作用,我不知道为什么。代码编译并运行,但地图为空。

2 个答案:

答案 0 :(得分:1)

  • 要检查line是否包含word不区分大小写,可以使用Apache Commons Lang库,特别是this方法:StringUtils.containsIgnoreCase(CharSequence str, CharSequence searchStr)
    此库还有其他可以提供帮助的实用程序方法,例如striptrim在使用它们之前清理字符串非常有用。

  • 另一个问题可能是文件的编码。 FileReader始终使用平台默认编码。尝试使用new InputStreamReader(new FileInputStream(filePath), <encoding>)从文件中读取。

答案 1 :(得分:0)

请记住contains方法具有案例敏感性。

你正在对小写line.toLowerCase()

进行排序

因此可能不匹配。

请为line.toLowerCase()输入System.out.print语句并将word检查

System.out.print(line.toLowerCase()+" "+word);

如果是这种情况,那么解决方案是在if条件下也将该单词小写。

if(line.toLowerCase().contains(word.toLowerCase())){
        lines.add(read.getLineNumber());
}