2016-11-16 26 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