我想使用正则表达式格式化我的HTTP标头。我使用split(' ')
然后进行数组操作来完成它,但这次我想使用正则表达式执行此操作。
我想把这个输入作为一个巨大的字符串:
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
方法,我的代码更具可读性。但是,我的第一次尝试是使用正则表达式,因为我的目标是提取/格式化字符串。
我知道通过正则表达式是可能的,但它是否值得呢?每个人都在想什么?
感谢您的时间。
答案 0 :(得分:3)
这应该适合你:
const data = `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`
const format = data => {
const headers = {}
const result = { headers }
const regex = /([\w-]+): (.*)/g
let temp
while (temp = regex.exec(data)) {
headers[temp[1]] = temp[2]
}
temp = data.match(/(\w+)\s+(.*?)\s+(.*)/)
result.verb = temp[1]
result.path = temp[2]
result.protocol = temp[3]
return result
}
console.log(format(data))
/([\w-]+): (.*)/g
此正则表达式将匹配任何header-name: value
,并像['header-name: value', 'header-name', 'value']
然后我们将其设置为headers
header-name
为key
且value
为value
最后我们解析第一行以获取其他信息
(\w+)
匹配并捕获1个或多个单词字符
\s+
匹配1个或更多空格
(.*?)
匹配并捕获任何字符 not gready *?
\s+
直到找到一个或多个空白区域
(.*)
匹配evrything(直到行尾)
答案 1 :(得分:2)
您可以将.split()
与RegExp
\s/
一起使用,其中.split()
返回的数组的前三个元素应为verb
,path
, protocol
;在前三个元素上使用.shift()
,其余结果使用当前索引和数组的下一个索引设置为headers
对象的属性,值对,直到数组.length
求值为{{1在false
循环的条件下。
while
答案 2 :(得分:0)
这应该有效。
搜索:
(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(Host):\s(.+)$\n(Cache-Control):\s(.+)$\n(Postman-Token):\s(.+)$/gm;
const str = `GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f`;
const subst = `{ 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}`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log(result);

输入:
GET /v1/search?q=bob%20dylan&type=artist HTTP/1.1
Host: api.spotify.com
Cache-Control: no-cache
Postman-Token: e2f09f98-f
输出:
{ headers:
{ Host 'api.spotify.com',
'Cache-Control': 'no-cache',
'Postman-Token': 'e2f09f98-f'
},
verb: 'GET',
path: '/v1/search?q=bob%20dylan&type=artist',
protocol: 'HTTP/1.1'
}