如何在Shell脚本中对API返回的版本号执行条件解码?
解决方案
核心思路
- 区分两种格式:先判断返回字符串是UUID还是URL编码的日期字符串,避免误操作
- 日期字符串解码:你的日期示例是经过两次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
相关产品推荐
相关产品推荐

