You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中查找字符串内最后一组连续数字的起始索引

解决方案

提供两种稳定实现,都覆盖了你提出的所有边界场景,不会抛出索引越界异常:

方法1:反向遍历实现(无正则,逻辑直观更稳定)

从字符串末尾倒序检索,先定位到最后一组连续数字的最后一位,再向前推到这组数字的首位即可:

public static int findLastDigitGroupStart(String str) {
    // 空串直接返回0,符合需求
    if (str == null || str.isEmpty()) {
        return 0;
    }
    int len = str.length();
    int lastDigitPos = -1;
    // 第一步:从后往前找第一个出现的数字(即最后一组数字的最后一位)
    for (int i = len - 1; i >= 0; i--) {
        if (Character.isDigit(str.charAt(i))) {
            lastDigitPos = i;
            break;
        }
    }
    // 字符串中没有任何数字,返回0
    if (lastDigitPos == -1) {
        return 0;
    }
    // 第二步:从找到的数字位置向前找,直到遇到非数字,最终的位置就是组起始索引
    int startPos = lastDigitPos;
    for (int i = lastDigitPos - 1; i >= 0; i--) {
        if (!Character.isDigit(str.charAt(i))) {
            break;
        }
        startPos = i;
    }
    return startPos;
}

测试效果:

  • 输入"987abc<*(123",返回6
  • 输入"123",返回0
  • 输入"",返回0
  • 输入"a12b345c",返回5(对应最后一组数字345的起始位置)
  • 输入"abc!@#"(无数字),返回0

方法2:正则实现(代码更简洁)

如果可以接受正则语法,可以用\d+(?!.*\d)直接匹配最后一组连续数字,自动获取起始索引:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public static int findLastDigitGroupStartByRegex(String str) {
    if (str == null || str.isEmpty()) {
        return 0;
    }
    Pattern pattern = Pattern.compile("\\d+(?!.*\\d)");
    Matcher matcher = pattern.matcher(str);
    return matcher.find() ? matcher.start() : 0;
}

正则\d+(?!.*\d)的含义是匹配一组连续数字,且这组数字之后不存在其他数字,正好匹配最后一组连续数字的需求,边界处理逻辑和方法1完全一致。

内容的提问来源于stack exchange,提问作者toydotgame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:24:03