从字符串末尾反向解析,获取第三个连字符前的数据的实现方案
几种可行的字符串解析实现技巧
针对你提出的字符串解析需求(特殊字符串直接返回,否则截取到反向第三个-之前的子串),我整理了几个实用的实现思路,附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
相关产品推荐
相关产品推荐

