0
爲API調用準備請求url我使用RegEx從一個對象中用值替換String中的值。一個 '模板字符串' 的Node.js中的正則表達式不顯示所有匹配
實施例:
'https://api.fitbit.com/1/user/:ownerId/:collectionType/date/:date.json'
其中:OWNERID,:collectionType和:
{ collectionType: 'activities',
date: '2016-10-12',
ownerId: 'xxxxx',
ownerType: 'user',
subscriptionId: 'xxx' }
正則表達式:日期將由值從下面的對象替換我正在使用的是:
/:([\w]+)/gi
這使我可以在每個匹配中使用組的內容f蝕刻對象的值。我有以下函數返回請求URL:(在這種情況下,匹配而不「」):(URL是「模板字符串」和解碼的上述目的)
function regexifyUrlTemplate(url, regex, decoded) {
console.log('Regexify URL: ', url)
console.log('Regexify Data: ', decoded)
var m
while ((m = regex.exec(url)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++
}
console.log('Matches: ', m)
url = String(url).replace(m[0], decoded[m[1]])
console.log('Replaced ' + m[0] + ' with ' + decoded[m[1]])
}
console.log('Regexify :', url)
return url
}
控制檯顯示我有以下日誌:
Regexify URL: https://api.fitbit.com/1/user/:ownerId/:collectionType/date/:date.json
Regexify Data: { collectionType: 'activities',
date: '2016-10-12',
ownerId: 'xxx',
ownerType: 'user',
subscriptionId: 'xxx' }
Matches: [ ':ownerId',
'ownerId',
index: 31,
input: '\'https://api.fitbit.com/1/user/:ownerId/:collectionType/date/:date.json\'' ]
Replaced :ownerId with xxx
Matches: [ ':date',
'date',
index: 59,
input: '\'https://api.fitbit.com/1/user/xxx/:collectionType/date/:date.json\'' ]
Replaced :date with 2016-10-12
Regexify : 'https://api.fitbit.com/1/user/xxx/:collectionType/date/2016-10-12.json'
它成功替換:ownerId和:date,但不替換:collectionType。我通過regex101.com驗證了RegEx,並使用日誌中的更新字符串檢查了正則表達式。
任何人都可以解釋爲什麼:collectionType不匹配?我可以發現的唯一區別是'T',但與[\ w]無關。 (也試過[a-zA-Z])。
忘了提,有多個URL模板不同的API調用。 RegEx應該沒問題,否則regex101不會返回所有組。 – martwetzels
爲什麼這麼複雜?只要做'url.replace(正則表達式,函數(_,k){return decoded [k];})'! – Bergi