字符串替换函数行为 - 错误"nothing to repeat"



下面的代码给出了错误:

var a = "hello {0} world";
a.replace(/{0}/g, "little");

但这个有效:

var a = "hello {str} world";
a.replace(/{str}/g, "little");

为什么会出现此错误?

因为{n}(其中n是正整数(是量词语法,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Quantifiers

你不希望花括号在这里有它们的"特殊含义",但希望它们被视为普通字符——所以你应该转义它们。

a.replace(/{0}/g,"little")

replace()的参数是一个正则表达式。

特别地,大括号{}是正则表达式元字符(它们是范围量词(。

必须对正则表达式中的大括号进行转义(使用(才能使其工作。

例如:

a.replace(/{0}/g, "little");

会起作用。这将从字面上治疗牙套。

您得到的特定错误消息:

SyntaxError:无效的正则表达式:/{0}/:没有可重复的

是因为引擎希望在量词之前有一些文本,因此例如,x{0}作为正则表达式将是一个有效的参数。

在另一种情况下,使用

a.replace(/{str}/g, "little");

确实有效,因为大括号失去了作为元字符的特殊含义,而被字面处理。范围限定符必须采用{n}{n,}{n,m}的形式,其中nm是整数。

问题

大括号内的数字有一个特殊的含义,它是一种限定语法。

解决方案

您必须使用{ }来转义大括号

下面是一个例子

var b = "hello {0} world"; 
console.log(b.replace(/{0}/g,"little"));