我有一个用户可以随时编辑的字符串,以及正在对字符串进行的正则表达式,将其添加到xml然后保存它,但是他们可以在字符串中添加“$ 1”。我只想保存文本'$ 1',但我必须在$ 1所在的同一个字符串上执行正则表达式。它每次用正则表达式中的一个字符替换$ 1。
如何找到并替换此字符串中的$ 1?
正在发生的事情的例子:
string1 = '<item id="1">i have $100</item>'
regexp = new RegExp('<item id="1"([^<]|<[^\/]|<\/[^i]|<\/i[^t]|<\/it[^e]|<\/ite[^m]|<\/item[^>])*<\/item>');
data = '<data><item id="1">i have no money</item><item id="2">i have no money</item></data>'
data = data.replace(regexp, string1);
结果
<data><item id="1">i have >00</item><item id="2">i have no money</item></data>
答案 0 :(得分:3)
只有在正则表达式中有一个捕获组时才会发生这种情况。
如果您不希望群组捕获,请将?:
放在群组的开头。
/foo(?:bar)/
答案 1 :(得分:3)
如果您要在replace()
来电中添加可能包含$N
的变量字符串,则可以阻止$N
成为$
将$$
替换为$
,将其视为反向引用。显然,与JS正则表达式中的其他特殊字符不同,\
字符无法使用$
进行转义 - 必须使用前面的data = data.replace(regexp, string1.replace('$', '$$$'));
进行转义(转到图)。
在您的示例中,您可以执行以下操作来解决问题:
$
这应该将$$
转换为string1
中的{{1}},防止它们被视为反向引用。
(注意:我发现了这个小金块here)
答案 2 :(得分:0)
您可以转义$
。例如:
var replacement = '<item id="1">i have \\$100</item>';
当您拥有捕获组并需要编写$
时很有用。