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

Java递归字符串截取方法实现求助:提取指定字符间子串

Java递归实现包裹字符间子串的解决方案

明确需求:实现递归方法,接收字符串、唯一出现的开字符和闭字符,返回两者之间的子串(不含包裹字符)。比如输入"Hello (there] how are you?"、'('、']',返回"there"。

你的两段代码存在的问题

  • 第一段代码:逻辑完全偏离需求,仅不断截取字符串首字符,仅判断开头两个字符是否为开/闭字符后返回空,既未跟踪是否找到开字符,也未收集中间目标子串,递归方向错误。
  • 第二段代码:存在语法错误(newString未初始化就直接使用),且无返回值;虽用indexOf获取了字符索引,但完全未结合递归逻辑实现子串提取。

正确的递归实现

我们可以通过辅助递归方法传递状态(是否已找到开字符、当前收集的子串),主方法对外提供简洁的调用入口:

public class SubstringExtractor {
    // 对外暴露的主方法
    public static String getSubstring(String str, char open, char close) {
        // 调用辅助递归方法,初始状态:未找到开字符,收集的子串为空
        return extractRecursive(str, open, close, false, "");
    }

    // 辅助递归方法,处理核心逻辑
    private static String extractRecursive(String str, char open, char close, boolean foundOpen, String current) {
        // 递归终止条件:字符串为空,返回当前收集的内容
        if (str.isEmpty()) {
            return current;
        }

        char firstChar = str.charAt(0);
        String remaining = str.substring(1);

        if (firstChar == close) {
            // 遇到闭字符,终止递归,返回已收集的内容
            return current;
        } else if (firstChar == open) {
            // 遇到开字符,标记状态为已找到,继续递归处理剩余字符串
            return extractRecursive(remaining, open, close, true, current);
        } else if (foundOpen) {
            // 已找到开字符,将当前字符加入收集的子串,继续递归
            return extractRecursive(remaining, open, close, true, current + firstChar);
        } else {
            // 未找到开字符,直接跳过当前字符,继续递归
            return extractRecursive(remaining, open, close, false, current);
        }
    }

    // 测试示例
    public static void main(String[] args) {
        String input = "Hello (there] how are you?";
        System.out.println(getSubstring(input, '(', ']')); // 输出:there
    }
}

递归逻辑说明

  1. 终止条件:当处理的剩余字符串为空,或者遇到闭字符时,返回已收集的子串。
  2. 状态跟踪:通过foundOpen布尔值标记是否已经找到开字符,避免收集开字符之前的无关内容。
  3. 逐步收集:一旦找到开字符,后续遇到的字符(直到闭字符)都会被加入结果子串,直到触发终止条件。

另一种简洁实现(无需辅助参数)

如果不需要严格的递归遍历,也可以结合indexOf简化代码(本质是利用字符串API实现,适合快速需求场景):

public static String getSubstring(String str, char open, char close) {
    if (str.isEmpty()) {
        return "";
    }
    int openIdx = str.indexOf(open);
    if (openIdx == -1) {
        return "";
    }
    String afterOpen = str.substring(openIdx + 1);
    int closeIdx = afterOpen.indexOf(close);
    if (closeIdx == -1) {
        return "";
    }
    return afterOpen.substring(0, closeIdx);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:05:06