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

从字符串末尾反向解析,获取第三个连字符前的数据的实现方案

几种可行的字符串解析实现技巧

针对你提出的字符串解析需求(特殊字符串直接返回,否则截取到反向第三个-之前的子串),我整理了几个实用的实现思路,附Java代码示例:

1. 反向遍历计数法(最直观的手动实现)

这种方法逻辑清晰,适合对性能要求较高或者需要精细控制的场景:

  • 先判断输入是否是特殊字符串"-NONE----",是的话直接返回原内容
  • 从字符串末尾开始遍历,统计遇到的-数量
  • 当计数到第三个-时,记录当前索引,截取从开头到该索引的子串
public static String parseString(String input) {
    if ("-NONE----".equals(input)) {
        return input;
    }
    int count = 0;
    int targetIndex = -1;
    // 从末尾向前遍历
    for (int i = input.length() - 1; i >= 0; i--) {
        if (input.charAt(i) == '-') {
            count++;
            if (count == 3) {
                targetIndex = i;
                break;
            }
        }
    }
    // 确保找到足够的'-',避免异常(根据业务需求调整处理逻辑)
    return targetIndex != -1 ? input.substring(0, targetIndex) : input;
}

2. 分割重组法(简洁易读)

利用字符串分割功能,将原字符串拆分为数组后,取前N个元素重新拼接:

  • 特殊字符串直接返回
  • 按-分割字符串得到数组
  • 计算需要保留的元素个数:数组长度 - 3
  • 将前N个元素用-连接起来
public static String parseString(String input) {
    if ("-NONE----".equals(input)) {
        return input;
    }
    String[] parts = input.split("-");
    // 处理分割后可能的空元素(比如开头的'-')
    int keepCount = parts.length - 3;
    if (keepCount <= 0) {
        return input; // 不符合格式的情况,返回原内容或按需处理
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < keepCount; i++) {
        if (i > 0) {
            sb.append("-");
        }
        sb.append(parts[i]);
    }
    return sb.toString();
}

3. 正则表达式法(一行代码风格)

用正则匹配从开头到倒数第三个-之前的内容,代码非常简洁,适合对正则熟悉的场景:

  • 特殊字符串单独判断
  • 正则^(.*?)(?:-[^-]+){3}$匹配目标内容,其中(?:-[^-]+){3}表示末尾三个由-开头的非-序列
  • 通过分组提取需要的子串
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public static String parseString(String input) {
    if ("-NONE----".equals(input)) {
        return input;
    }
    Pattern pattern = Pattern.compile("^(.*?)(?:-[^-]+){3}$");
    Matcher matcher = pattern.matcher(input);
    return matcher.find() ? matcher.group(1) : input;
}

测试验证

用你给出的输入示例测试,三种方法都能得到预期输出:

  • 输入"-A123456-B987-013691-000-109264821" → 输出"-A123456-B987"
  • 输入"-NONE----" → 输出"-NONE----"
  • 输入"C1234567-A1241-EF-012361-000-18273460" → 输出"C1234567-A1241-EF"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:17:30