2016-10-12 60 views
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])。

+0

忘了提,有多個URL模板不同的API調用。 RegEx應該沒問題,否則regex101不會返回所有組。 – martwetzels

+3

爲什麼這麼複雜?只要做'url.replace(正則表達式,函數(_,k){return decoded [k];})'! – Bergi

回答

2

的問題是在這裏url = String(url).replace(m[0], decoded[m[1]])

您的exec()期間修改url,所以matche的指數變化......

var url = 'https://api.fitbit.com/1/user/:ownerId/:collectionType/date/:date.json'; 
 

 
var data = { collectionType: 'activities', 
 
    date: '2016-10-12', 
 
    ownerId: 'xxxxx', 
 
    ownerType: 'user', 
 
    subscriptionId: 'xxx' } 
 

 
var reg = /\:([\w]+)/gi; 
 

 
function regexifyUrlTemplate(url, regex, decoded) { 
 
    console.log('Regexify URL: ', url) 
 
    console.log('Regexify Data: ', decoded) 
 
    
 
    var m, originUrl = url; 
 
    while ((m = regex.exec(originUrl)) !== 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 
 
} 
 

 
regexifyUrlTemplate(url, reg, data)