我正在构建一个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;如果我的文本文件是使用以下结构排列的(此结构在每个句子后都有换行符。
但是,如果文本文件按以下结构排列(每个句子后没有换行符),程序将在输出屏幕上输出所有三个句子。
我不想在文本文件中的每个句子后添加换行符,以便此程序正常工作。如何更改我的代码,使其适用于任何类型的文本文件,无论其结构如何?
答案 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();
}