以字符串形式转义RegExp.lastMatch($&)

时间:2016-11-16 15:32:03

标签: javascript regex string literals

我有一个用户输入文本的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);

问题是,不是按字面附加$&,而是附加lastMatch,而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

1 个答案:

答案 0 :(得分:2)

所以,在经过额外的阅读,思考,尝试和额外的#FFFFFF之后,我得到了解决这个问题所需的一切。

为了告诉正则表达式放置文字$&而不是entire match,您必须使用以下内容:

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

$$告诉正则表达式引擎一个字面的美元符号,$$$$告诉它两个字面的美元符号 - &gt;在替换字符串中一个接一个的两个字面美元符号实际上变成了一个字面的美元符号$。 其后是&,它成为正常的文字$&,没有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