2016-07-20 108 views
0

我碰到一段代碼來這樣的:瞭解JavaScript的替代

btnHref.replace(/myCode=([^&]*)/, 'myCode=' + itm.MyCode); 

我理解一般的替換功能([文本替換],[文本與替換])

不過我不太明白是怎麼回事:

/myCode=([^&]*)/ 

它尋找「mycode的=」,我假設剩下的就是爲「=」之後的任何字符正則表達式。

但是我沒有得到我想要的結果..

例子:

var myParams = 'myCode=' + itm.ReportCode + '&myVersion=' + itm.ReportVersion; 

if (btnHref.indexOf('myCode') > -1) { 
    btnHref = btnHref.replace(/myCode=([^&]*)/, myParams); 
} else { 
    btnHref += btnHref.indexOf('?') > -1 ? '&' + myParams : '?' + myParams; 
} 

第一次通過一切都很好。 (它擊中else語句)
但是通過第二次(它碰到的第一個語句在IF)和我結束了一串:

/MyController/MyAction?myCode=AAA&myVersion=1.1&myVersion=2.2 

我誤解正則表達式是什麼?

+0

這就是爲什麼你應該永遠* *使用正則表達式時,你真的需要一個解析器一個很好的例子。 [查詢字符串比他們看起來更細微](http://zzzzbov.com/blag/querystring-hell),所以我總是推薦使用解析庫。 [我寫了一個](https://www.npmjs.com/package/querystringjs),雖然還有很多其他可用的。 – zzzzBov

回答

2

[^&]*匹配除&以外的任何字符序列。所以它取代了從myCode=開始直到但不包括第一個&的所有內容。當你第二次這樣做時,它僅在&myVersion=2.2之後離開btnHref的部分。因此,您最終得到兩個參數&myVersion=,因爲您要插入另一個參數。

該替換意圖取代只是myCode參數,而不是任何其他參數。您應該使用單獨的操作來替換myVersion

var newCode = 'myCode=code123'; 
 
var newVersion = 'myVersion=Version1.2'; 
 

 
var btnHref = '/MyController/MyAction'; 
 

 
if (btnHref.indexOf('myCode') > -1) { 
 
    btnHref = btnHref.replace(/myCode=([^&]*)/, newCode); 
 
} else { 
 
    btnHref += btnHref.indexOf('?') > -1 ? '&' + newCode : '?' + newCode; 
 
} 
 
if (btnHref.indexOf('myVersion') > -1) { 
 
    btnHref = btnHref.replace(/myVersion=([^&]*)/, newVersion); 
 
} else { 
 
    btnHref += btnHref.indexOf('?') > -1 ? '&' + newVersion : '?' + newVersion; 
 
} 
 
console.log(btnHref); 
 

 
var newCode = 'myCode=codeXXX'; 
 
var newVersion = 'myVersion=Version2.2'; 
 

 
var btnHref = '/MyController/MyAction'; 
 

 
if (btnHref.indexOf('myCode') > -1) { 
 
    btnHref = btnHref.replace(/myCode=([^&]*)/, newCode); 
 
} else { 
 
    btnHref += btnHref.indexOf('?') > -1 ? '&' + newCode : '?' + newCode; 
 
} 
 
if (btnHref.indexOf('myVersion') > -1) { 
 
    btnHref = btnHref.replace(/myVersion=([^&]*)/, newVersion); 
 
} else { 
 
    btnHref += btnHref.indexOf('?') > -1 ? '&' + newVersion : '?' + newVersion; 
 
} 
 
console.log(btnHref);

+0

感謝您的解釋。這使得它現在變得更清晰。 – PrivateJoker