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

如何在Shell脚本中对API返回的版本号执行条件解码?

解决方案

核心思路

  1. 区分两种格式:先判断返回字符串是UUID还是URL编码的日期字符串,避免误操作
  2. 日期字符串解码:你的日期示例是经过两次URL编码的结果(%253a是%3a的编码,而%3a对应:),因此需要执行两次URL解码才能得到正确格式

实现示例

Python 版本

from urllib.parse import unquote
import re

def process_version(version_str):
    # 匹配UUID(支持带/不带连字符的标准格式)
    uuid_pattern = re.compile(r'^[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$')
    if uuid_pattern.match(version_str):
        return version_str
    
    # 匹配URL编码的ISO日期格式(包含两次编码的冒号%253a)
    date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}T.*%253a.*Z$')
    if date_pattern.match(version_str):
        # 两次解码还原冒号
        return unquote(unquote(version_str))
    
    # 其他未知格式直接返回原字符串
    return version_str

# 测试验证
test_cases = [
    '4e2cab57b35a098993cbaec2455add',
    '2023-03-23T04%253a38%253a09Z'
]
for case in test_cases:
    print(f"输入: {case} → 输出: {process_version(case)}")

JavaScript 版本

function processVersion(versionStr) {
    // 匹配UUID(支持带/不带连字符)
    const uuidRegex = /^[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$/;
    if (uuidRegex.test(versionStr)) {
        return versionStr;
    }

    // 匹配URL编码的ISO日期
    const dateRegex = /^\d{4}-\d{2}-\d{2}T.*%253a.*Z$/;
    if (dateRegex.test(versionStr)) {
        // 两次解码还原冒号
        return decodeURIComponent(decodeURIComponent(versionStr));
    }

    return versionStr;
}

// 测试验证
console.log(processVersion('4e2cab57b35a098993cbaec2455add')); // 输出原UUID
console.log(processVersion('2023-03-23T04%253a38%253a09Z')); // 输出2023-03-23T04:38:09Z

关键细节

  • UUID判断:正则覆盖了标准UUID的两种形式(带连字符的36位和不带的32位),确保不会把日期误判为UUID
  • 日期解码逻辑:因为API返回的日期是经过两次URL编码的,所以必须解码两次才能正确还原:符号
  • 扩展性:如果后续API返回的格式有细微变化,可以调整正则表达式的匹配规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:53:08