Javascript 使用正则表达式格式化HTTP头

Javascript 使用正则表达式格式化HTTP头,javascript,regex,string,http,http-headers,Javascript,Regex,String,Http,Http Headers,我想使用正则表达式格式化我的HTTP头。我已经使用split(“”)和数组操作完成了这个操作,但是这次我想使用regex执行这个操作 我想输入一个巨大的字符串: GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1 Host: api.spotify.com Cache-Control: no-cache Postman-Token: e2f09f98-f8e0-43f7-5f0e-b16e670399e2 并将其格式化为对象,如下

我想使用正则表达式格式化我的HTTP头。我已经使用
split(“”)
和数组操作完成了这个操作,但是这次我想使用regex执行这个操作

我想输入一个巨大的字符串:

GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f8e0-43f7-5f0e-b16e670399e2
并将其格式化为对象,如下所示:

{ headers: 
   { Host: ' api.spotify.com',
     'Cache-Control': ' no-cache',
     'Postman-Token': ' e2f09f98-f8e0-43f7-5f0e-b16e670399e2' 
   },
  verb: 'GET',
  path: '/v1/search?q=bob%20dylan&type=artist',
  protocol: 'HTTP/1.1' 
}
我知道通过使用
split
方法,我的代码更具可读性。然而,我的第一次尝试是使用正则表达式,因为我的目标是提取/格式化字符串

我知道通过regex是可能的,但它值得吗?大家怎么想


谢谢您的时间。

这应该适合您:

const data=`GET/v1/search?q=bob%20dylan&;类型=艺术家HTTP/1.1
主持人:api.spotify.com
缓存控制:没有缓存
邮递员代币:e2f09f98-f8e0-43f7-5f0e-b16e670399e2`
常量格式=数据=>{
常量头={}
const result={headers}
常量正则表达式=/([\w-]+):(.*)/g
让临时工
while(temp=regex.exec(数据)){
标题[temp[1]]=temp[2]
}
temp=data.match(/(\w+)\s+(.*)\s+(.*)/)
result.verb=temp[1]
result.path=temp[2]
result.protocol=temp[3]
返回结果
}
log(格式(数据))
这应该可以

搜索人:

(GET)\s(.+)\s(HTTP\/\d+\.\d+)\n(Host):\s(.+)$\n(Cache-Control):\s(.+)$\n(Postman-Token):\s(.+)$
替换为:

{ headers:    \n\t{ $4 '$5',\n\t  '$6': '$7',\n\t  '$8': '$9'\n\t}, \n\tverb: '$1',\n\tpath: '$2',\n\tprotocol: '$3'\n}
JavaScript代码:

const regex=/(GET)\s(+)\s(HTTP\/\d++.\d+)\n(主机):\s(+)$\n(缓存控制):\s(+)$\n(邮差令牌):\s(+)$/gm;
const str=`GET/v1/search?q=bob%20dylan&;类型=艺术家HTTP/1.1
主持人:api.spotify.com
缓存控制:没有缓存
邮递员代币:e2f09f98-f`;
const subst=`{headers:\n\t{$4'\$5',\n\t'\$6':'\$7',\n\t'\$8':'\$9'\n\t},\n\tverb:'\$1',\n\t路径:'\$2',\n\t协议:'\$3'\\n};
//被替换的值将包含在结果变量中
const result=str.replace(regex,subst);
控制台日志(结果)
您可以将
.split()
RegExp
\s/
一起使用,其中
.split()
返回的数组的前三个元素应该是
动词
路径
协议
;在前三个元素上使用
.shift()
,剩余的结果设置为属性,使用数组的当前索引和下一个索引,在
标题处的
对象的值对,直到数组
.length
循环时计算为
false

let getHeaders=headers=>{
设h=headers.split(/\s/);
设o={
动词:h.shift(),
路径:h.shift(),
协议:h.shift(),
标题:{}
};
while(h.length){
o、 标题[h.shift()]=h.shift();
}
返回o
};
var str=`GET/v1/search?q=bob%20dylan&;类型=艺术家HTTP/1.1
主持人:api.spotify.com
缓存控制:没有缓存
邮递员代币:e2f09f98-f8e0-43f7-5f0e-b16e670399e2`;

log(getHeaders(str))在这里做什么?我似乎无法跟上第一个
(\w+
)。它正在查找一个或多个单词,后跟一个或多个空格
\s+
,后跟
(.*?
)?我将编写解释。我为标题键添加了toLowerCase(),以解决与nodejs http样式请求的兼容性问题,但这很有效。同样,httpVersion不是协议,路径最初在那个里被称为“url”,动词传统上在节点中也是“method”。这个例子不适用,但我喜欢你们所做的。GET/HTTP/1.1主机:192.168.2.174连接:保持活动缓存控制:最大年龄=0升级不安全请求:1用户代理:Mozilla/5.0(Windows NT 6.3;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/74.0.3729.157 Safari/537.36接受:text/html、application/xhtml+xml、application/xml;q=0.9,图像/webp,图像/apng,/;q=0.8,申请/签名交换;v=b3接受编码:gzip,deflate,br接受语言:en-US,en;q=0.9