【问题标题】:JavaScript Non-regex ReplaceJavaScript 非正则表达式替换
【发布时间】:2008-11-13 21:22:21
【问题描述】:

任何现有的 JavaScript 框架是否有非正则表达式 replace() 函数, 还是已经将其作为一次性功能发布在网络上的某个地方?

例如我想替换"@!#$123=%" 并且我不想担心要转义哪些字符。大多数语言似乎都有两种替换方法。我希望看到添加这个简单的东西。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您仍然需要替换MDN 中指定的几个美元符号组合。

    这会产生$bc 而不是$$bc

    'abc'.replace('a', '$$')
    

    不用担心的最好方法是使用函数replace:

    'abc'.replace('a', () => '$$')
    

    【讨论】:

      【解决方案2】:

      我可能误解了你的问题,但 javascript 确实有一个 replace()

      var string = '@!#$123=%';
      var newstring = string.replace('@!#$123=%', 'hi');
      

      edit:(参见 cmets)第 5 版似乎确实包含此信息,尽管当我 link directly 时它并没有显示出来。这是相关部分:

      replace() 方法执行搜索和替换操作。它将正则表达式作为第一个参数,将替换字符串作为第二个参数。它在调用它的字符串上搜索与指定模式匹配的字符串。如果正则表达式设置了 g 标志,则 replace() 方法将字符串中的所有匹配项替换为替换字符串;否则,它只替换它找到的第一个匹配项。 如果 replace( ) 的第一个参数是字符串而不是正则表达式,则该方法会按字面意思搜索该字符串,而不是像 search( ) 那样使用 RegExp( ) 构造函数将其转换为正则表达式。强>

      【讨论】:

      • 嗯。也许我正在查看仅显示正则表达式示例的旧版本的“Javascript:权威指南”。所以我从来没有尝试过上面的代码。现在我觉得真的很蠢。 -10 分给我。
      • 有人可以查看最新版本的“Javascript:权威指南”吗?现在包括这种例子吗?
      • 下面尼克的回答对于“无正则表达式”选项更可靠,因为本机替换方法在 replace 字符串中使用特殊字符。因此,虽然用“hi”替换文本很好,但用包含“$”的任何内容替换可能会导致意外结果。尝试以 "a".replace("a","$$b") 为例:)
      • javascript函数只替换第一个条目
      • 这个答案很好地回答了 OP。关键是replace()string 搜索值视为文字字符串。在这种情况下,“$”没有被特殊对待。如果显式调用了RegExp(),则与replace() 无关,因为将RegExp 对象传递给replace(),而不是字符串。
      【解决方案3】:

      试试这个:

      function replaceAllTemp(str,find, replace) { 
      var ignoreCase=true;
      var _token;
      var token=find;
      var newToken=replace;
      var i = -1;
      
      if ( typeof token === "string" ) {
      
          if ( ignoreCase ) {
      
              _token = token.toLowerCase();
      
              while( (
                  i = str.toLowerCase().indexOf(
                      token, i >= 0 ? i + newToken.length : 0
                  ) ) !== -1
              ) {
                  str = str.substring( 0, i ) +
                      newToken +
                      str.substring( i + token.length );
              }
      
          } else {
              return this.split( token ).join( newToken );
          }
      
      }
      return str;
      };
      

      【讨论】:

        【解决方案4】:

        无论是否区分大小写,您都可以这样做。
        可悲的是,JavaScript 的 indexOf 不会将语言环境与不变量作为参数,因此如果您想保留文化特异性,则必须将 toLowerCase 替换为 toLocaleLowerCase

        function replaceAll(str, find, newToken, ignoreCase)
        {
            var i = -1;
        
            if (!str)
            {
                // Instead of throwing, act as COALESCE if find == null/empty and str == null
                if ((str == null) && (find == null))
                    return newToken;
        
                return str;
            }
        
            if (!find) // sanity check 
                return str;
        
            ignoreCase = ignoreCase || false;
            find = ignoreCase ? find.toLowerCase() : find;
        
            while ((
                i = (ignoreCase ? str.toLowerCase() : str).indexOf(
                    find, i >= 0 ? i + newToken.length : 0
                )) !== -1
            )
            {
                str = str.substring(0, i) +
                    newToken +
                    str.substring(i + find.length);
            } // Whend 
        
            return str;
        }
        

        或作为原型:

        if (!String.prototype.replaceAll ) {  
        String.prototype.replaceAll = function (find, replace) {
            var str = this, i = -1;
        
            if (!str)
            {
                // Instead of throwing, act as COALESCE if find == null/empty and str == null
                if ((str == null) && (find == null))
                    return newToken;
        
                return str;
            }
        
            if (!find) // sanity check 
                return str;
        
            ignoreCase = ignoreCase || false;
            find = ignoreCase ? find.toLowerCase() : find;
        
            while ((
                i = (ignoreCase ? str.toLowerCase() : str).indexOf(
                    find, i >= 0 ? i + newToken.length : 0
                )) !== -1
            )
            {
                str = str.substring(0, i) +
                    newToken +
                    str.substring(i + find.length);
            } // Whend 
        
            return str;
        };
        }
        

        【讨论】:

          【解决方案5】:

          我在搜索非正则表达式 javascript 字符串 replace() 方法时遇到了完全相同的问题。我的解决方案是使用 split() 和 join() 的组合:

          "some text containing regex interpreted characters: $1.00".split("$").join("£");
          

          给出:

          "一些包含正则表达式解释字符的文本:£1.00"

          与replace()比较:

          "some text containing regex interpreted characters: $1.00".replace(new RegExp("$"),"£")
          

          这很奇怪:

          "一些包含正则表达式解释字符的文本:$1.00£"

          【讨论】:

          • 网上没有足够的例子来告诉你简单的替换方法——“一些包含正则表达式解释字符的文本:$1.00”.replace("$","£");
          • 这就是网络编程:重新发明轮子。 JavaScript 的replace() 是个糟糕的笑话。感谢这个黑客。我认为这是最好的解决方案。 +1
          • «$» 表示正则表达式中的行尾!所以RegExp("$") 没有什么奇怪的,它与预期的行尾匹配。在将美元发送到 RegExp 之前,您应该已经将其转义:RegExp("\$")
          • 注意:这巧妙地替换了所有的出现。所以s.split("$").join("£") 等价于s.replace(/\$/g, "£")s.replace(RegExp("\\$", "g"), "£")
          猜你喜欢
          • 2010-11-12
          • 2016-09-23
          • 1970-01-01
          • 2011-02-03
          • 2014-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-30
          相关资源
          最近更新 更多