如何实现类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
相关产品推荐
相关产品推荐

