【问题标题】:Javascript replace issue with $ [duplicate]Javascript用$替换问题[重复]
【发布时间】:2019-02-09 01:59:06
【问题描述】:

我正在尝试将以下示例中的“this”替换为“$$Ashok”。我没有得到预期的输出。

    var adHtmltext ="this is ashok"
    adHtmltext = adHtmltext.replace("this", "$$Ashok");
    alert(adHtmltext );

为什么它在输出中显示一个 $?如何解决这个问题?

这里是 jsfiddle http://jsfiddle.net/RxDa5/

请帮忙。

【问题讨论】:

  • @ephemient:这是关于美元符号和正则表达式的问题。

标签: javascript


【解决方案1】:

看看MDN documentation

替换字符串可以包括以下特殊替换模式:

$$Inserts a "$".

所以你必须这样做:

adHtmltext.replace("this", "$$$$Ashok");

另见Javascript string replace weirdness -- $$$$ gets collapsed to $$ -- what's the reason behind this result?

【讨论】:

    【解决方案2】:

    $$$ 的转义码,因为$ 是正则表达式反向引用的转义码。不幸的是,你需要这个:

    var adHtmltext ="this is ashok"
    adHtmltext = adHtmltext.replace("this", "$$$$Ashok");
    alert(adHtmltext );
    

    【讨论】:

      【解决方案3】:

      美元符号是.replace() 的保留字符

      确实,在您的 jsFiddle 代码中,就在顶部,您已将其用于保留用途 - 即您在其中捕获部分表达式的 $1

      $$ 用于转义美元符号。在这种情况下,您需要为您实际需要的每个美元符号提供两个美元符号。

      这是因为否则您的输出中不能包含字符串 $1

      【讨论】:

        【解决方案4】:

        .replace 方法还将接受正则表达式作为第一个参数,如果您对文本的一部分进行分组,您可以使用“$”字符将其包含在输出文本中,并使用“反向引用”和一个数字,指定使用哪个组($1、$2 等)。

        因为'$'在这个上下文中有特殊的含义,需要转义,而'$$'是产生正常'$'的转义序列,所以你只需要'$$$$Ashok'在你的代码中。

        【讨论】:

          【解决方案5】:

          在替换目标模式的字符串中可以包含一些特殊模式,带有“$$”的字符串就是其中之一。请参阅Mozilla MDN docs 以获得更好的参考。

          在您的具体情况下,“$$”变为“$”,因为其他字符与“$”的某些组合,例如“$&”,被保留用于与某些子字符串匹配。如果您希望替换工作,只需使用 '$$$$Ashok',它将在最终字符串中变为 '$$Ashok'。

          【讨论】:

            【解决方案6】:

            寻找一个通用的解决方案,我得到了以下内容:

            var input = prompt( 'Enter input:' ) || '';
            var result = 'foo X bar X baz'.replace( /X/g, input.replace( /\$/g, '$$$$' ) );
            

            有效:

            输入:$$
            结果: foo $$ bar $$ baz

            输入:$&
            结果: foo $& bar $& baz

            但这有点棘手,因为多级 $ 转义。看到$$$$在内部replace...


            所以,我尝试使用未应用特殊替换模式的回调:

            var result = 'foo X bar X baz'.replace( /X/g, function () {
                var input = prompt( 'Enter input:' ) || '';
                return input;
            } );
            

            它也有效,但有一个警告:每次替换都会执行回调。所以在上面的例子中,用户被提示了两次……

            最后,这里是“回调”解决方案的固定代码,将提示移出替换回调:

            var input = prompt( 'Enter input:' ) || '';
            var result = 'foo X bar X baz'.replace( /X/g, function () {
                return input;
            } );
            

            总而言之,您有两种解决方案:

            • 在替换字符串上应用 .replace(/\$/g, '$$$$') 转义
            • 使用回调,它只是返回替换字符串

            MDN 参考:String.prototype.replace()#Description

            【讨论】:

              【解决方案7】:

              任何自定义的替换函数都可以更优雅地解决这个问题。您只需从中返回预期的字符串,它将被原样替换。

              function customReplacer() {
              return "$$Ashok";
              }
              adHtmltext = adHtmltext.replace("this", customReplacer);
              

              【讨论】:

              • 虽然很聪明,但扩展性不是很好。如果我想使用不同的替换字符串,具体取决于输入字符串怎么办?
              • @cale_b,这个自定义的替换函数需要很少的参数,我想我们可以利用它们。 Link
              猜你喜欢
              • 2017-12-22
              • 2021-05-21
              • 1970-01-01
              • 1970-01-01
              • 2021-12-31
              • 2011-03-18
              • 2013-06-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多