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

如何在Bash中校验字符串是否符合-key value格式?

Bash正则匹配多组键值对的解决方案

你的问题在于原正则只覆盖了key的字母部分,且没处理value和多组匹配逻辑,以下是修正方案:

核心问题分析

  1. 原正则-([a-zA-Z]+)仅匹配纯字母的key,漏掉了规则允许的数字和下划线,像-MY_KEY_2这种合法key会匹配失败。
  2. 没有处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:05:31