2016-11-16 89 views
0

我有一個input框,用戶可以在其中鍵入文本。我正在使用輸入的文本並替換大文本文件的一部分。

的問題是,如果用戶輸入的字符$&它會導致lastMatch代替文字文本這當然是後跟一個符號(&)沒有任何特殊意義的美元符號($)。

你可以看到用戶輸入的位置:

user input

爲了模擬用戶輸入,我寫了下面的代碼:

var originalString = "# Mandatory parameter\n#EPCDatabase/EPCdatabase.param/epc.db.user=\n# Mandatory parameter"; 
 

 
var regexExpression = new RegExp('#EPCDatabase\/EPCdatabase.param\/epc.db.user=.*$', "im"); 
 
var replaceSting = "EPCDatabase\/EPCdatabase.param\/epc.db.user=test#$#%^%>$&<%(*" 
 
var newPropertiesText = originalString.replace(regexExpression, replaceSting); 
 

 
console.log(originalString); 
 
console.log(newPropertiesText);

的問題是,從字面上而不是追加$&,它將追加lastM ATCH,並且創造了newPropertiesText如下:

last match

As explained here,我試圖逃避$兩個$$,因此這將意味着一個文字美元,而不是特殊組合:

"EPCDatabase\/EPCdatabase.param\/epc.db.user=aaaa#$#%^%>$&<%(*".replace(/\$&/g, '$$&'); 
            here is the problem ^^ 

但這並沒有幫助,所以我嘗試了\\$\\$和類似模式的不同組合。但我無法發送到正則表達式一個簡單的$&文字。

編輯: 使用此功能escape沒有解決的問題:

RegExp.escape= function(s) { 
 
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
 
}; 
 

 
var originalString = "# Mandatory parameter\n#EPCDatabase/EPCdatabase.param/epc.db.user=\n# Mandatory parameter"; 
 

 
var regexExpression = new RegExp('#EPCDatabase\/EPCdatabase.param\/epc.db.user=.*$', "im"); 
 
var replaceSting = RegExp.escape("EPCDatabase\/EPCdatabase.param\/epc.db.user=aaaa#$#%^%>$&<%(*"); 
 
var newPropertiesText = originalString.replace(regexExpression, replaceSting); 
 
console.log(originalString); 
 
console.log(newPropertiesText);

你可以看到它仍返回lastMatch

+0

[Javascript是否有RegExp.escape函數?](http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript) – Laurel

+0

@Laurel請看我最新的問題 –

回答

1

因此,經過額外的閱讀,思考,一些嘗試和其他#FFFFFF頭髮,我得到了什麼才能解決這個問題。

爲了告訴正則表達式把文字$&代替entire match的,你必須使用以下命令:

.replace(/\$&/, '$$$$&')

$$告訴正則表達式引擎一個文字美元符號,$$$$告訴它的兩個字面美元符號 - >和替換字符串中的兩個字面美元符號實際上成爲一個字面美元符號$。 後面跟着一個&它變成了正常字面$&沒有last match的意思。

var originalString = "# Mandatory parameter\n#EPCDatabase/EPCdatabase.param/epc.db.user=\n# Mandatory parameter"; 
 

 
var regexExpression = new RegExp('#EPCDatabase\/EPCdatabase.param\/epc.db.user=.*$', "im"); 
 
var replaceSting = "EPCDatabase\/EPCdatabase.param\/epc.db.user=aaaa#$#%^%>$&<%(*".replace(/\$&/, '$$$$&'); 
 
var newPropertiesText = originalString.replace(regexExpression, replaceSting); 
 
console.log(originalString); 
 
console.log(newPropertiesText);

你可以,如果你想用它玩view the code here