如何在Bash中校验字符串是否符合-key value格式?
Bash正则匹配多组键值对的解决方案
你的问题在于原正则只覆盖了key的字母部分,且没处理value和多组匹配逻辑,以下是修正方案:
核心问题分析
- 原正则
-([a-zA-Z]+)仅匹配纯字母的key,漏掉了规则允许的数字和下划线,像-MY_KEY_2这种合法key会匹配失败。 - 没有处理value的多种格式(带双引号、以
-开头等),也没实现多组键值对的匹配逻辑,所以只能抓到第一个key。
修正后的实现代码
循环提取法(推荐,支持逐步校验)
这种方式可以逐个提取键值对,同时处理格式校验和10组上限限制:
str="-mykey1 keyvalue1 -MY_KEY_2 \"value with spaces\" -key_3 -value3" # 单组键值对的匹配正则 regex='-([a-zA-Z0-9_]+)\s+((?:"([^"]+)")|(\S+))' remaining="$str" count=0 while [[ $remaining =~ $regex && $count -lt 10 ]]; do count=$((count+1)) key="${BASH_REMATCH[1]}" # 优先取带引号的value内容,否则取不带引号的 if [[ -n "${BASH_REMATCH[3]}" ]]; then value="${BASH_REMATCH[3]}" else value="${BASH_REMATCH[4]}" fi echo "第$count组:key=$key,value=$value" # 移除已匹配的部分,清理剩余字符串开头的空格 remaining="${remaining#*${BASH_REMATCH[0]}}" remaining=$(echo "$remaining" | sed 's/^[[:space:]]*//') done # 校验剩余内容 if [[ -n "$remaining" ]]; then if [[ $count -ge 10 ]]; then echo "警告:超过10组键值对,剩余内容未处理:$remaining" else echo "错误:存在不符合格式的内容:$remaining" fi fi
全量匹配法(一次性校验格式)
如果需要先校验整个字符串是否完全符合格式,再提取内容,可以用这个:
str="-mykey1 keyvalue1 -MY_KEY_2 \"value with spaces\" -key_3 -value3" # 匹配1-10组键值对的全量正则 regex='^(?:-([a-zA-Z0-9_]+)\s+((?:"([^"]+)")|(\S+))\s*){1,10}$' if [[ $str =~ $regex ]]; then echo "格式合法,提取的键值对:" # 每4个捕获组对应一组键值对,循环遍历 for ((i=1; i<${#BASH_REMATCH[@]}; i+=4)); do key="${BASH_REMATCH[$i]}" value="${BASH_REMATCH[$i+2]:-${BASH_REMATCH[$i+3]}}" echo "key=$key,value=$value" done else echo "字符串格式不符合要求" fi
正则说明
([a-zA-Z0-9_]+):匹配合法key,覆盖大小写字母、数字、下划线\s+:匹配key和value之间的任意空白(至少1个)(?:"([^"]+)"):匹配带双引号的value,捕获组自动去掉引号(\S+):匹配不带引号的value,支持以-开头的情况
内容的提问来源于stack exchange,提问作者ikhvjs
相关产品推荐
相关产品推荐

