含空格值的键值对(KVP)提取正则表达式求解
提取含空格值的键值对正则方案
核心正则表达式
使用带负向预查的正则可精准匹配这类键值对:
\b([^=\s]+)=((?:(?!\b[^=\s]+=).)*)
正则解析
\b:单词边界,确保键是独立完整单元,避免部分匹配(比如不会把abc=1 def=2里的bc=1 de误判为键值对)([^=\s]+):捕获键,匹配不含等号和空格的字符(键本身不能有空格或等号是这类场景的默认规则)=:匹配键值分隔符((?:(?!\b[^=\s]+=).)*):捕获值,通过负向预查实现“直到下一个键出现前的所有内容”:(?!\b[^=\s]+=):断言当前位置之后不是新的键值对开头.*:匹配任意字符(包括空格、换行、制表符),直到触发上述断言
之前尝试的正则失效原因
.+?=.+?:非贪婪匹配会在遇到第一个空格时停止取值,无法处理值含空格的情况\s?([^\s]+):直接排除空格,完全无法匹配带空格的值
代码示例
JavaScript
const inputStr = "a=1 b=cat c=1 and 2 d=3"; const kvRegex = /\b([^=\s]+)=((?:(?!\b[^=\s]+=).)*)/g; const result = []; let match; while ((match = kvRegex.exec(inputStr)) !== null) { // 清理值的首尾空白,符合后续清理要求 const cleanedValue = match[2].trim(); result.push(`${match[1]}=${cleanedValue}`); } console.log(result); // 输出: ["a=1", "b=cat", "c=1 and 2", "d=3"]
Python
import re input_str = "a=1 b=cat c=1 and 2 d=3" kv_regex = re.compile(r'\b([^=\s]+)=((?:(?!\b[^=\s]+=).)*)') result = [] for match in kv_regex.finditer(input_str): cleaned_value = match.group(2).strip() result.append(f"{match.group(1)}={cleaned_value}") print(result) # 输出: ['a=1', 'b=cat', 'c=1 and 2', 'd=3']
补充说明
如果输入字符串首尾有空白,或键值对之间有多个空白(换行、制表符),可在正则前后加\s*兼容:
\s*([^=\s]+)=((?:(?!\s*[^=\s]+=).)*)\s*
不过用trim()/strip()清理首尾空白的方式更灵活,也符合你提出的“可接受后续清理”要求。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

