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

如何实现类Java的Bash indexOf函数并解决匹配异常问题

实现与Java indexOf功能一致的Bash字符串索引函数

需求背景

  • 最初目标:将Perl的index脚本逻辑转换为Bash函数,用于获取指定字符串中子串的起始索引
  • 问题发现:现有Bash索引实现存在缺陷——当子串不存在时返回错误结果,不符合预期
  • 最终需求:实现一个和Java indexOf完全一致的Bash函数,支持起始搜索索引参数,同时解决匹配特殊字符(如})时的异常问题

最终实现代码

# 仿Java风格的indexOf函数
# 参数说明:
# $1: 原字符串
# $2: 需要查找的子串
# $3: 起始搜索索引(可选,默认值为0)
indexOf() {
    local str="$1"
    local substr="$2"
    local start=${3:-0}

    # 处理起始索引为负数的情况,等同于从0开始搜索
    if (( start < 0 )); then
        start=0
    fi

    # 截取从起始索引开始的子串
    local trimmed_str="${str:start}"
    # 查找子串在截取后字符串中的位置(expr index从1开始计数)
    local pos=$(expr index "$trimmed_str" "$substr")

    # 子串不存在时返回-1
    if (( pos == 0 )); then
        echo "-1"
        return
    fi

    # 转换为原字符串中的绝对索引(减去expr的1起始偏移)
    echo $(( start + pos - 1 ))
}

关键细节说明

  • 起始索引兼容:支持可选的起始索引参数,未传入时默认从0开始;若传入负数索引,自动重置为0,和Java indexOf行为对齐
  • 不存在处理:通过判断expr index的返回值是否为0,直接返回-1,避免现有实现的错误结果
  • 特殊字符适配:使用局部变量包裹字符串和子串,解决了匹配}等特殊字符时的解析异常问题

测试示例

# 基础匹配:子串存在
indexOf "Hello World" "World"  # 输出6
# 指定起始索引搜索
indexOf "Hello Hello World" "Hello" 6  # 输出6
# 子串不存在
indexOf "Hello World" "Test"  # 输出-1
# 特殊字符匹配
indexOf "abc}def" "}"  # 输出3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:51:03