如何从句子数组列表中获取具有特定单词的句子?

时间:2015-12-13 16:15:07

标签: java android arrays string

我正在构建一个android / Java程序,它从文本文件中读取并将文本文件中的每个句子存储在数组列表中。然后它检查每个句子中特定单词的出现并打印出包含单词的句子。

这是我到目前为止的代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.text4);
    text = (TextView)findViewById(R.id.info2);
    BufferedReader reader = null;

    try {
        reader = new BufferedReader(
                new InputStreamReader(getAssets().open("input3.txt")));

        String line;
        List<String> sentences = new ArrayList<String>();


        }

    }

}

从上面的代码中可以看出,程序会查找单词&#34;尽管&#34;。

我的文本文件由三个句子组成。这个程序通过输出特定句子和#34来完美地工作;尽管&#34;如果我的文本文件是使用以下结构排列的(此结构在每个句子后都有换行符。

但是,如果文本文件按以下结构排列(每个句子后没有换行符),程序将在输出屏幕上输出所有三个句子。

我不想在文本文件中的每个句子后添加换行符,以便此程序正常工作。如何更改我的代码,使其适用于任何类型的文本文件,无论其结构如何?

1 个答案:

答案 0 :(得分:1)

您的split()根本不起作用。首先,您的表达式只匹配这个确切的子字符串:

.?!\r\n\t

比赛中还包括最后的额外标签。

你可能想要使用一个字符类,例如[0-9],但你忘了括号。

由于line只是文件中的一行文字,为什么要在\r\n上进行拆分?另外,为什么选项卡(\t)被视为句子分隔符?

split()错误的下一部分是您只获取第一个值([0])的事实。如果分裂有效,那将丢弃第二句和第三句。

此外,在查找单词时,请确保您不会匹配较长的单词,例如如果要查找is,请不要与this匹配,因此您需要包含字边界检查(\b)。

确保匹配的令牌,例如句号,包含在句子中,你需要使用零宽度正向后视非捕捉组((?<=X))。

单词匹配也应该不区分大小写。

最后,代码结构错了。它不会编译,因为你错过了一个结束括号(})。由于压痕不好,这会让人感到特别困惑。

这是更新的代码:

try (BufferedReader reader = new BufferedReader(
                            new InputStreamReader(getAssets().open("input3.txt")))) {

    List<String> sentences = new ArrayList<>();
    for (String line; (line = reader.readLine()) != null; ) {
        for (String sentence : line.split("(?<=[.?!\t])")) {
            sentence = sentence.trim();
            if (! sentence.isEmpty()) {
                sentences.add(sentence);
            }
        }
    }

    Pattern word = Pattern.compile("\\bDESPITE\\b", Pattern.CASE_INSENSITIVE);
    for (String sentence : sentences) {
        if (word.matcher(sentence).find()) {
            text.setText(sentence);
            break; // No need to continue searching
        }
    }

} catch (IOException e) {
    Toast.makeText(getApplicationContext(), "Error reading file!", Toast.LENGTH_LONG).show();
    e.printStackTrace();
}