0

我有一个用户可以随时编辑的字符串,以及一个正在对该字符串执行的正则表达式,以将其添加到 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>
4

3 回答 3

6

如果您想在replace()调用中放入一个可能包含$N' 的变量字符串,则可以通过替换为来防止 '被$N视为反向引用。显然,与 JS 正则表达式中的其他特殊字符不同,该字符不能用 a 转义- 它必须用前面的转义(见图)。$$$$\$

在您的示例中,您可以执行以下操作来解决此问题:

data = data.replace(regexp, string1.replace('$', '$$$'));

这应该将任何$'s 变成$$in string1,防止它们被视为反向引用。

(注意:我在这里找到了这个小金块)

于 2014-03-24T14:27:38.790 回答
3

只有当您在正则表达式中有一个捕获组时,才会发生这种情况。

如果您不希望您的组捕获,则放置?:在组的开头。

/foo(?:bar)/
于 2012-06-12T21:40:30.453 回答
-1

你可以逃脱$. 例如:

var replacement = '<item id="1">i have \\$100</item>';

当您有捕获组并需要编写一个$.

于 2012-06-12T22:00:52.220 回答