如何使用java流在java中找到包含某个单词的行数?

wooyq4lh  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(306)

我的方法是从一个文本文件中读取,在每一行中找到单词“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

1hdlvixo

1hdlvixo1#

使用regex强制单词边界:

count = lines.filter(w -> w.matches("(?i).*\\bthe\\b.*")).count();

或者对于一般情况:

count = lines.filter(w -> w.matches("(?i).*\\b" + search + "\\b.*")).count();

细节: \b 意思是“单词边界” (?i) 意思是“忽略案例”
使用单词边界可以防止 "Therefore" 匹配。
注意,在java中,与许多其他语言不同, String#matches() 必须匹配整个字符串(而不仅仅是在字符串中找到匹配项)才能返回 true 因此 .* 在正则表达式的两端。

cbjzeqam

cbjzeqam2#

更新:

感谢霍尔格提出以下宝贵建议:
更好: filter(Pattern.compile("\\bthe\\b", Pattern.CASE_INSENSITIVE).asPredicate()) ,避免重复 Pattern.compile(…) 每一行。

当发布一个完整的解决方案时,我也会将try与资源结合起来,即使op没有(尤其是op没有)。
更新的方法定义:

public static long findThe(String filename) {
    long count = 0;
    try (Stream<String> lines = Files.lines(Paths.get(filename))) {
        count = lines.filter(Pattern.compile("\\bthe\\b", Pattern.CASE_INSENSITIVE).asPredicate()).count();
    } catch (IOException x) {
        System.out.println("File: " + filename + " not found");
    }
    return count;
}

原始答案:

代替

w->w.contains("the")

具有

w->Pattern.compile("\\bthe\\b", Pattern.CASE_INSENSITIVE).matcher(w).find()

这个 \b 用于单词边界。

相关问题