为了账号安全,请及时绑定邮箱和手机立即绑定

通过忽略某些元素来提取一组数字的第一次和最后一次出现

通过忽略某些元素来提取一组数字的第一次和最后一次出现

喵喵时光机 2023-06-21 16:38:56
需要通过忽略某个元素从一行数字中获取第一次出现和最后一次出现。例如从00 44 88 45 00 25 78 46 00 46 58 00我需要提取44和58(忽略所有出现的00)。我正在使用的代码:  final Pattern p = Pattern.compile( "(?!00)(\\d{2})(\\s)(.*)(?!00)(\\d{2})" );  final Matcher m = p.matcher( "00 44 88 45 00 25 78 46 00 46 58 00" );  final String first = m.replaceAll( "$1" );  final String last = m.replaceAll( "$4" );  System.out.println( "first = " + first );  System.out.println( "last = " + last );控制台输出:first = 00 44 00last = 00 58 00
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

修复当前方法

您可以像这样修复您的方法:


final Pattern p = Pattern.compile( "^(?:00(?:\\s+00)*\\s+)?(\\d{2})(.*?)(\\d{2})(?:\\s+00(?:\\s+00)*)?$" );

final Matcher m = p.matcher( "00 44 88 45 00 25 78 46 00 46 58 00" );

final String first = m.replaceAll( "$1" );

final String last = m.replaceAll( "$3" );

提取方法

或者,您可以在不替换的情况下提取值:

^(?:00(?:\s+00)*\s+)?(\d{2})|(\d{2})(?:\s+00(?:\s+00)*)?$

Java演示:

String s = "00 44 88 45 00 25 78 46 00 46 58 00";

Pattern pattern = Pattern.compile("^(?:00(?:\\s+00)*\\s+)?(\\d{2})|(\\d{2})(?:\\s+00(?:\\s+00)*)?$");

Matcher matcher = pattern.matcher(s);

while (matcher.find()){

    if (matcher.group(1) != null) {

        System.out.println(matcher.group(1)); 

    }

    if (matcher.group(2) != null)  {

        System.out.println(matcher.group(2));

    }

输出:


44

58

使用过滤方法进行拆分

此外,您可以简单地用空格拆分字符串,删除所有00项目并获取第一个和最后一个项目:


String s = "00 44 88 45 00 25 78 46 00 46 58 00";

List<String> result = Arrays.stream(s.split("\\s+"))

       .filter(i -> !i.equals("00"))

       .collect(Collectors.toList());

System.out.println(result.get(0));                // => 44

System.out.println(result.get(result.size()-1));  // => 58



查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信