如何用通用正则表达式解析含空格值的Key=Value命令字符串
通用正则表达式解析含空格值的任意Key=Value键值对
核心正则表达式
要匹配任意键值对,同时兼容值里包含空格的情况,可以用这个正则:
(\S+)=((?:(?!\S+=).)*)
正则逻辑拆解
(\S+):捕获键名,\S匹配所有非空白字符,确保键名里不会有空格或等号,符合常规命令行参数的键规则=:匹配键和值之间的分隔符((?:(?!\S+=).)*):捕获值,用负前瞻(?!\S+=)确保当前位置后面不是新键的开头(即非空白字符+等号),这样就能把从等号开始,直到下一个键出现前的所有内容(包括空格)都作为当前键的值
代码实现(以Python为例)
直接用这个正则解析成字典:
import re def parse_key_value(cmd_str): # 编译正则提升效率 pattern = re.compile(r'(\S+)=((?:(?!\S+=).)*)') # 匹配所有键值对 matches = pattern.findall(cmd_str) # 去除值两端的空白,返回字典 return {key: value.strip() for key, value in matches} # 测试几种典型场景 test_inputs = [ "name=Bob job=Software Engineer location=San Francisco", "action=deploy env=prod config=/etc/app/config.yaml", "message=Hello there! status=success log=User logged in", "opt1= value with leading spaces opt2=another value with trailing " ] for input_str in test_inputs: print(f"原始输入: {input_str}") print(f"解析结果: {parse_key_value(input_str)}\n")
扩展场景处理
如果你的场景里值会用单/双引号包裹(比如title="My Document"),可以用这个增强版正则,支持解析带引号的值,还能处理引号内的转义字符:
(\S+)=("(?:\\.|[^"])*"|'(?:\\.|[^'])*'|(?:(?!\S+=).)*)
对应的解析代码可以稍微调整,把引号去掉:
def parse_quoted_key_value(cmd_str): pattern = re.compile(r'(\S+)=("(?:\\.|[^"])*"|'(?:\\.|[^'])*'|(?:(?!\S+=).)*)') matches = pattern.findall(cmd_str) result = {} for key, value in matches: # 去掉首尾的引号(如果有) if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")): value = value[1:-1].replace('\\"', '"').replace("\\'", "'") result[key] = value.strip() return result
注意点
- 这个方案默认键名是不含空白和等号的,如果你的场景需要支持带特殊字符的键(比如
my-key=value),可以把正则里的\S+改成[\w\-]+来允许下划线和连字符 - 如果值里本身包含
键=这样的子串(比如note=key=value is a test),正则会把整个key=value is a test作为note的值,这是合理的——没有引号包裹的情况下,无法区分值内的等号和键值对的分隔等号
内容的提问来源于stack exchange,提问作者jam
相关产品推荐
相关产品推荐

