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

用于提取模式匹配组的Regex one liner

公良照
2023-03-14

使用Java11,我想知道如何使用流应用编程接口将所有组匹配提取到一行程序中的字符串列表。

给定此regexp和字符串:

String regexp = "(\\d\\d\\d)-(\\d)-(\\d\\d)";
String str = "123-8-90";

我知道如何在多行中获得结果:

Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(str);

List<String> matches = new ArrayList<>();
if (matcher.find()) {
  matches.add(matcher.group(1));
  matches.add(matcher.group(2));
  matches.add(matcher.group(3));
}

System.out.println(matches);

这将打印3个不同数字字符串的预期列表:[123,8,90]

我试图在一条航线上实现同样的目标:

List<String> matches = Pattern.compile(regexp)
    .matcher(str)
    .results()
    .map(MatchResult::group)
    .collect(Collectors.toList());

System.out.println(matches);

这将打印意外的:[123-8-90]

如何在流中使用MatchResult::group(int)方法?

共有2个答案

姚臻
2023-03-14

您不必要的复杂正则表达式使您的解决方案容易出错和复杂。有几个更简单的方法可以做到这一点:

  1. 使用regex,\d并将流映射到MatchResult::group
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> matches = 
                Pattern.compile("\\d+")
                        .matcher("123-8-90")
                        .results()
                        .map(MatchResult::group)
                        .collect(Collectors.toList());

            System.out.println(matches);// [123, 8, 90]
    }
}

在线演示

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> matches = Arrays.asList("123-8-90".split("-"));
        System.out.println(matches);// [123, 8, 90]
    }
}

在线演示

除了使用正则表达式的解决方案外,还可以遍历字符串的字符,并将数字收集到列表中。与正则表达式解决方案一样,也有很多方法可以做到这一点。

朱宏爽
2023-03-14

你很接近。您需要平面映射匹配结果#组

List<String> matches = Pattern.compile(regexp)
    .matcher(str)
    .results()
    .flatMap(mr -> IntStream.rangeClosed(1, mr.groupCount())
        .mapToObj(mr::group))
    .collect(Collectors.toList());

System.out.println(matches);
 类似资料:
  • Im使用java中的OpenCV,使用eclipse开发,图像以这种方式读取以进行模板匹配。 这很好,但我的图像不在本地计算机中。我应该比较mysql数据库中服务器上的2000个图像。把2000张图片保存到我的电脑上,然后读取它们是没有意义的。 所以我需要的是那个高鬼。imread(infle)读取图像:Highgui。imread(图像中的图像)或Highgui。imread(文件填充),我找不

  • 一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常

  • 主机权限和 内容脚本匹配 是基于匹配模式定义的一组 URL。匹配模式本质上是一个以允许的 schema(http,https,file 或ftp 开头)的URL,并且可以包含 “*” 字符。特殊模式 < all_urls > 匹配以允许的 schema 开头的任何 URL。 每个模式包含 3 个部分: schema - 例如,http 或file 或 * 注意:对文件 URL 的访问不是自动的。用

  • MySQL提供了一个标准的SQL模式匹配,和基于扩展的正则表达式的模式匹配Unix工具(如vi,grep,sed)一样。 SQL模式匹配可以使用“_“来匹配任意单个字符,”%“可以用来匹配任意数量(包含0个字符)的字符。在MySQL中,SQL模式匹配的大小写默认是不敏感的,以下有一些例子,当你在使用SQL模式时,不要使用 = 或 <>,而是使用LIKE 或 NOT LIKE。 要找到以字符“b"开

  • 除了我们常见的控制语句之外,Rust还提供了一个更加强大的关键字——match 。但是,需要指出的一点是,match只是匹配,要发挥其全部威力,还需要模式的配合。本章,我们就将的对Rust的模式匹配进行一番探索。 本章内容: match关键字 模式 pattern

  • 模式匹配 内容脚本可以作用到模式匹配定义好的URL集合上. 你能对manifest文件的内容脚本段的部分进行一个或多个模式匹配操作. 这里描述模式匹配语法 — 当你指定内容脚本将影响哪些URL时你需要遵循的规则. 任意一个模式匹配本质上都是一个以认可的协议(例如:http, https, file, ftp 或者 chrome-extension)开头的URL,只是URL你可以包含"*"字符. 这