当前位置: 首页 > 知识库问答 >
问题:

JAVA-8:在文件的1行中多次匹配1个模式(通过过滤器)

倪培
2023-03-14
    Test 1
    Test 2 Test 3 Test 11
    Match: 1
    Match: 2
    Match: 3
    Match: 11
    Match: 1

该方案是:

void addMysteries( Path path, String output) {
    Pattern p = Pattern.compile(".?Test (.)");
    try (Stream<String> lines = Files.lines( path)) {
        lines.map( p::matcher)
                .filter(Matcher::matches)
                .forEach( matcher -> System.out.println("Match: " + matcher.group(1)));
    } catch( Exception e) {
        e.printStackTrace();
    }
}

在Java7中,下面的软件运行良好。为什么这个管用而上面不管用?

pattern = Pattern.compile(".?Test (.)");
input = "Test 1\n\rOtherStuff\nTest 2 Test 3";
matcher = pattern.matcher(input);
while (matcher.find()) {
    System.out.println(  "Match: " + matcher.group( 1));
}   

共有1个答案

赫连睿
2023-03-14

您必须对每一行使用matcher,您的代码应该如下所示:

try (Stream<String> lines = Files.lines(path)) {
    lines.forEach(line ->
            {
                Matcher matcher = pattern.matcher(line);
                while (matcher.find()){
                    System.out.println("Match: " + matcher.group(1));
                }
            }
    );
} catch (Exception e) {
    e.printStackTrace();
}

在Java9+中,您可以在第二个示例中使用matcher#results(),因此可以是:

Pattern pattern = Pattern.compile(".?Test (.)");
try (Stream<String> lines = Files.lines(path)) {
    lines.forEach(input -> pattern.matcher(input)
            .results()
            .forEach(matcher -> System.out.println("Match: " + matcher.group(1)))
    );
} catch (Exception e) {
    e.printStackTrace();
}

或者正如@Holger提到的,您可以将FlatMapMatcher#results()一起使用,如下所示:

try (Stream<String> lines = Files.lines(path)) {
    lines.flatMap(input ->
            pattern.matcher(input).results()
    ).forEach(matchResult -> System.out.println("Match: " + matchResult.group(1)));
} catch (IOException e) {
    e.printStackTrace();
}

甚至可以使用Scanner读取整个文件,其中可以使用Scanner::FindAll,它返回如下所示的流:

try (Scanner scanner = new Scanner(path)) {
    scanner.findAll(pattern).forEach(matchResult ->
            System.out.println("Match: " + matchResult.group(1))
    );
} catch (IOException e) {
    e.printStackTrace();
}

产出

Match: 1
Match: 2
Match: 3

您可以查看@Holger的results()findall()的两个后端口:

    null
 类似资料:
  • 如何使此过滤器在同一文本中的多个匹配项上工作? 这是返回链接的函数 使用筛选器的示例文本: Ut[点击这里|节点: 4]enim ad minim veniam,quis[点击这里|术语: 42]nostr的练习ullamco的劳动是新的和其他的结果。Duis ate irure Dolor in re的谴责在流言蜚语velit esse cilum[点击这里|术语: 1]Dolore eu fu

  • 问题内容: 我需要实施 其中ptrn是命令提示符样式模式,例如“ * 2010 * .txt” 我熟悉FilenameFilter类,但 由于String.matches()不接受此类模式而无法实现 。 谢谢! 问题答案: 所述接受的正则表达式 模式。 “ layman’s”变体的regex变体为。 因此,以下应该工作: 双反斜杠只是用来表示实际的反斜杠,因为反斜杠本身是Java中的转义字符。 另

  • 我在ES中有一个多匹配查询,希望添加一个过滤器。 添加此筛选器的语法是什么? 我试过:

  • 还有,如果真的要给出另一个模式,“/restful/**”不是更好吗?因为“/**”将匹配与“/RESTFUL/**”不匹配的URL,因此不由此筛选器链处理。

  • 问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器

  • 问题内容: 我已经使用Python和Django建立了一个在线画廊。我刚刚开始添加编辑功能,从旋转开始。我使用sorl.thumbnail按需自动生成缩略图。 当我编辑原始文件时,我需要清理所有缩略图,以便生成新的缩略图。每个图片有三到四个(我在不同场合有不同的图片)。 我 可以 在文件变量中进行硬编码…但是这很混乱,如果我改变工作方式,则需要重新访问代码。 理想情况下,我想进行正则删除。用正则表