正则表达式是解析 Cookie 字符串最轻量高效的方式,需分步匹配主键值对与属性,正确处理转义、引号、分号及布尔型属性,最终构建嵌套结构化对象。

正则表达式是解析 Cookie 字符串最轻量、高效的方式之一,关键在于准确匹配键值对,并正确处理转义、空格、分号分隔及可选属性(如 Expires、Path、Domain 等)。
核心匹配逻辑:分离主键值与属性块
Cookie 字符串结构通常为:
sessionid=abc123; Path=/; HttpOnly; Secure; Expires=Wed, 01 Jan 2025 00:00:00 GMT; Domain=.example.com应分两步提取:
- 先用
/^([^=]+)=([^;]*)(?:;|$)/gm提取首个键值对(即 cookie 名与主值),注意非贪婪匹配值部分,避免吞掉后续分号 - 再用
/;s*([A-Za-z]+)(?:=(?:[^;"]+|"[^"]*"))?/g全局匹配所有属性(支持无值型如HttpOnly和带值型如Path=/),并兼容带引号的值(如SameSite="Strict")
安全处理值中的转义与引号
Cookie 值可能含 URL 编码(%20)、双引号包裹、或内部分号。建议:
- 对主值和属性值统一执行
decodeURIComponent()(需先替换+为空格,再解码) - 若值被双引号包围(如
"v1;v2"),用value.replace(/^"(.*)"$/, '$1')去除外层引号,再解码 - 避免直接用
.split(';')切割,否则会错误拆分带分号的合法值
构建结构化对象:主 Cookie + 属性映射
最终输出推荐为嵌套对象,例如:
{ "sessionid": { "value": "abc123", "attributes": { "Path": "/", "HttpOnly": true, "Secure": true, "Expires": "Wed, 01 Jan 2025 00:00:00 GMT", "Domain": ".example.com" } } }实现要点:
- 遍历所有匹配到的键值对(支持多个 cookie 共存,如
a=1; b=2) - 每个 cookie 的属性写入
attributes对象;布尔型属性(HttpOnly、Secure、SameSite无值时)设为true - 重复属性名(如多个
Path)以最后出现为准,符合浏览器实际行为
可复用的精简实现示例(JavaScript)
以下函数可直接用于浏览器或 Node.js 环境:
function parseCookieString(str) {
const cookies = {};
const kvRegex = /([^=]+)=((?:[^;"]|"(?:[^"]|\")*")*);?/g;
let kvMatch;
while ((kvMatch = kvRegex.exec(str)) !== null) {
const [_, key, value] = kvMatch;
if (!key || key.trim() === '') continue;
const cookie = { value: value.trim().replace(/^"(.*)"$/, '$1') };
const attrs = {};
// 解析后续属性(从剩余字符串中截取该 cookie 后的部分)
const rest = str.slice(kvMatch.index + kvMatch[0].length);
const attrRegex = /s*([A-Za-z]+)(?:s*=s*(?:([^;"]+)|"((?:[^"]|\")*)"))?/g;
let attrMatch;
while ((attrMatch = attrRegex.exec(rest)) !== null) {
const [, name, plainVal, quotedVal] = attrMatch;
const val = typeof quotedVal !== 'undefined' ? quotedVal : (plainVal || '');
attrs[name] = val === '' ? true : decodeURIComponent(val.replace(/+/g, ' '));
if (attrRegex.lastIndex >= rest.indexOf(';') && rest.indexOf(';') !== -1) break;
}
cookies[key.trim()] = { value: decodeURIComponent(cookie.value.replace(/+/g, ' ')), attributes: attrs };
}
return cookies;
}


















