我的方法是从一个文本文件中读取,在每一行中找到单词“the”,并计算有多少行包含这个单词。我的方法确实有效,但问题是我只需要包含单词本身的行,而不需要单词的子字符串
例如,我不想要“因此”,即使它包含“the”,但它本身并不是。
我正试图找到一种方法,将行限制为包含“the”的行,并且单词的长度正好是3,但我无法做到这一点。
我现在的方法是:
public static long findThe(String filename) {
long count = 0;
try {
Stream<String> lines = Files.lines(Paths.get(filename));
count = lines.filter(w->w.contains("the"))
.count();
}
catch (IOException x)
{
// TODO Auto-generated catch block
System.out.println("File: " + filename + " not found");
}
System.out.println(count);
return count;
}
例如,如果文本文件包含以下行:
This is the first line
This is the second line
This is the third line
This is the fourth line
Therefore, this is a name.
方法将返回4
2条答案
按热度按时间1hdlvixo1#
使用regex强制单词边界:
或者对于一般情况:
细节:
\b
意思是“单词边界”(?i)
意思是“忽略案例”使用单词边界可以防止
"Therefore"
匹配。注意,在java中,与许多其他语言不同,
String#matches()
必须匹配整个字符串(而不仅仅是在字符串中找到匹配项)才能返回true
因此.*
在正则表达式的两端。cbjzeqam2#
更新:
感谢霍尔格提出以下宝贵建议:
更好:
filter(Pattern.compile("\\bthe\\b", Pattern.CASE_INSENSITIVE).asPredicate())
,避免重复Pattern.compile(…)
每一行。和
当发布一个完整的解决方案时,我也会将try与资源结合起来,即使op没有(尤其是op没有)。
更新的方法定义:
原始答案:
代替
具有
这个
\b
用于单词边界。