【问题标题】:How to replace all dots in a string using JavaScript如何使用 JavaScript 替换字符串中的所有点
【发布时间】:2011-01-24 08:23:52
【问题描述】:

我想替换 JavaScript 字符串中所有出现的点 (.)

例如,我有:

var mystring = 'okay.this.is.a.string';

我想得到:okay this is a string

到目前为止我尝试过:

mystring.replace(/./g,' ')

但这最终会将所有字符串替换为空格。

【问题讨论】:

  • aefxx 的答案是正确的,但正如仅供参考一样,正则表达式中的句点字符意味着匹配 一切,因此一切都是空格。用反斜杠转义它意味着匹配句点。
  • 感谢您的提示。我有一些使用 Regex 的 AHA 时刻(在构建应用程序时)。我真的很讨厌它_,你有一些很酷的好教程吗?
  • rubular.com 就是您要找的东西
  • Don't use a regex 为这个微不足道的事情。
  • 不幸的是,看起来非正则表达式不允许多次替换字符串。

标签: javascript string replace


【解决方案1】:

a = "曾经有一个国王。传播运算符。让。版本。常量。";

data = a.replaceAll(".","");

答案:data = "曾经有一个king spread operator let ver const";

您需要对该字符串使用 replaceAll() 方法。

【讨论】:

    【解决方案2】:

    replaceAll(search, replaceWith) [MDN]

     ".a.b.c.".replaceAll('.', ' ')
     // result: " a b c "
    
     // Using RegEx. You MUST use a global RegEx.
     ".a.b.c.".replaceAll(/\./g, ' ')
     // result: " a b c "
        
    

    replaceAll() 将所有出现的search 替换为replaceWith

    这实际上与使用带有全局正则表达式(*)的replace() [MDN] 相同,只是replaceAll() 在我看来更具可读性。

    (*) 表示它将匹配所有匹配项。


    如果您选择正则表达式,则重要():

    当使用regexp 时,您必须设置全局 ("g") 标志; 否则,它会抛出一个 TypeError: "replaceAll must be called with 一个全局正则表达式”。

    【讨论】:

    • 我比最佳答案更喜欢这个,因为它基本相同但更简单,因为它表明您不必为这么简单的事情使用正则表达式。 (我不确定为什么大多数答案都假设您需要使用正则表达式)
    • 重要的是要考虑与旧浏览器的兼容性。我在生产中使用它,因此不得不使用 RegEx 或 split('.').join('') 将其更改为 replace
    【解决方案3】:

    最简单的方法

    "Mr.".split('.').join("");

    .......

    控制台

    【讨论】:

      【解决方案4】:
      mystring.replace(new RegExp('.', "g"), ' ');
      

      【讨论】:

        【解决方案5】:

        您需要对. 进行转义,因为它在正则表达式中具有“任意字符”的含义。

        mystring = mystring.replace(/\./g,' ')
        

        【讨论】:

        • 只是为了澄清, \ 转义正则表达式中的特殊字符,如 .在这种情况下
        • 看起来像 sed.. 不知何故.. :)
        • 在 reagukar 表达式中的点。意味着一切,这是正确的解决方案!
        • @Kingalione 究竟什么不起作用?你能详细说明一下吗?
        • @Webwoman 这就是表达式末尾的g 修饰符的用途。将其视为(g)全局。
        【解决方案6】:
        String.prototype.replaceAll = function (needle, replacement) {
            return this.replace(new RegExp(needle, 'g'), replacement);
        };
        

        【讨论】:

          【解决方案7】:
          /**
           * ReplaceAll by Fagner Brack (MIT Licensed)
           * Replaces all occurrences of a substring in a string
           */
          String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
              var _token;
              var str = this + "";
              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;
          };
          
          alert('okay.this.is.a.string'.replaceAll('.', ' '));
          

          比使用正则表达式更快...

          编辑:
          也许在我做这段代码的时候我没有使用 jsperf。但最后这样的讨论是完全没有意义的,性能差异不值得代码在现实世界中的易读性,所以我的回答仍然有效,即使性能与正则表达式方法不同。

          EDIT2:
          我创建了一个库,允许您使用流畅的界面执行此操作:

          replace('.').from('okay.this.is.a.string').with(' ');
          

          https://github.com/FagnerMartinsBrack/str-replace

          【讨论】:

          • 非常有用。仅供参考:警报语句中的分号后面有流氓字符。
          • “流氓角色”是什么意思?
          • 他的意思是实体 & #8203 ;两次,即 Unicode 字符“零宽度空间”(U+200B)。更多信息fileformat.info/info/unicode/char/200b/index.htm
          • @FagnerBrack 出于性能原因,您可能应该将str.toLowerCase() 移出循环。此外,操作您正在搜索的字符串可能不是最佳的。我发布了一个修改版本的答案:stackoverflow.com/questions/2390789/…
          • @sstur 我想在操作后需要再次小写字符串。操纵我正在搜索的字符串是否在性能上有很大差异?我想易读性超过了好处(未经测试)。
          【解决方案8】:

          @scripto 变得更加简洁,没有prototype

          function strReplaceAll(s, stringToFind, stringToReplace) {
              if (stringToFind === stringToReplace) return s;
              for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind))
                  s = s.replace(stringToFind, stringToReplace);
              return s;
          }
          

          这是它的叠加方式:http://jsperf.com/replace-vs-split-join-vs-replaceall/68

          【讨论】:

            【解决方案9】:

            您可以使用 RegExp javasscript 对象替换所有出现的任何字符串/字符。

            这是代码,

            var mystring = 'okay.this.is.a.string';
            
            var patt = new RegExp("\\.");
            
            while(patt.test(mystring)){
            
              mystring  = mystring .replace(".","");
            
            }
            

            【讨论】:

              【解决方案10】:

              例子:我想把所有双引号(")都换成单引号(') 那么代码会是这样的

              var str= "\"Hello\""
              var regex = new RegExp('"', 'g');
              str = str.replace(regex, '\'');
              console.log(str); // 'Hello'
              

              【讨论】:

                【解决方案11】:

                对于这个简单的场景,我还建议使用内置在 javascript 中的方法。

                你可以试试这个:

                "okay.this.is.a.string".split(".").join("")
                

                问候

                【讨论】:

                  【解决方案12】:
                  var mystring = 'okay.this.is.a.string';
                  var myNewString = escapeHtml(mystring);
                  
                  function escapeHtml(text) {
                  if('' !== text) {
                      return text.replace(/&/g, "&")
                                 .replace(/&lt;/g, "<")
                                 .replace(/&gt;/g, ">")
                                 .replace(/\./g,' ')
                                 .replace(/&quot;/g, '"')
                                 .replace(/&#39/g, "'");
                  } 
                  

                  【讨论】:

                  • 要转义 HTML,请使用 createTextNode
                  【解决方案13】:

                  这更简洁/可读,并且应该比 Fagner Brack 发布的更好(toLowerCase 不在循环中执行):

                  String.prototype.replaceAll = function(search, replace, ignoreCase) {
                    if (ignoreCase) {
                      var result = [];
                      var _string = this.toLowerCase();
                      var _search = search.toLowerCase();
                      var start = 0, match, length = _search.length;
                      while ((match = _string.indexOf(_search, start)) >= 0) {
                        result.push(this.slice(start, match));
                        start = match + length;
                      }
                      result.push(this.slice(start));
                    } else {
                      result = this.split(search);
                    }
                    return result.join(replace);
                  }
                  

                  用法:

                  alert('Bananas And Bran'.replaceAll('An', '(an)'));
                  

                  【讨论】:

                  • 实际上,转义的 RegEx 似乎比 indexOf 执行得更好!听起来不对,但 JSPerf 表明它更快:jsperf.com/replaceall-indexof-vs-regex
                  • 也许当时我没有使用 jsperf。但最终这样的讨论是完全没有意义的,性能差异不值得代码在现实世界中的易读性,所以我的回答仍然有效。
                  【解决方案14】:

                  这里是 replaceAll 的另一个实现。希望它可以帮助某人。

                      String.prototype.replaceAll = function (stringToFind, stringToReplace) {
                          if (stringToFind === stringToReplace) return this;
                          var temp = this;
                          var index = temp.indexOf(stringToFind);
                          while (index != -1) {
                              temp = temp.replace(stringToFind, stringToReplace);
                              index = temp.indexOf(stringToFind);
                          }
                          return temp;
                      };
                  

                  然后就可以使用了:

                  var myText = "我叫乔治";
                  var newText = myText.replaceAll("George", "Michael");

                  【讨论】:

                  • 这不处理不区分大小写的搜索/替换。所以它在功能上等价于:string.split(stringToFind).join(stringToReplace)
                  【解决方案15】:
                  String.prototype.replaceAll = function(character,replaceChar){
                      var word = this.valueOf();
                  
                      while(word.indexOf(character) != -1)
                          word = word.replace(character,replaceChar);
                  
                      return word;
                  }
                  

                  【讨论】:

                  • 如果你给它这样的东西,它不会陷入无限循环:replaceAll('&amp;', '&amp;amp;') 吗? (诚​​然,这不是 OP 的问题)
                  • 但是“&”包含一个&amp;,因此循环永远不会用完要替换的东西(并且字符串会不断增长)。我刚才试了一下,它锁定了我的浏览器......
                  【解决方案16】:

                  另一种易于理解的解决方案:)

                  var newstring = mystring.split('.').join(' ');
                  

                  【讨论】:

                  • @HaggleLad 因为你不需要弄乱正则表达式
                  • 这不是比正则表达式慢很多吗?
                  • @Jasper 据我了解,它实际上在大多数浏览器中都更快,尽管我自己并没有实际对其进行基准测试。
                  • @BetoFrega 没有什么比一些经验数据更能说明你的情况了:)。感谢您提供链接!
                  • 如果您使用正则表达式,您确实希望将正则表达式存储在循环外的单独变量中。编译/解释一个正则表达式需要一些时间,但是一旦它被编译,它可以很快被使用。请尝试我所做的这些测试:jsperf.com/replace-vs-split-join-vs-replaceall/23
                  【解决方案17】:

                  我在点上添加双反斜杠以使其工作。加油。

                  var st = "okay.this.is.a.string";
                  var Re = new RegExp("\\.","g");
                  st = st.replace(Re," ");
                  alert(st);
                  

                  【讨论】:

                    【解决方案18】:
                    str.replace(new RegExp(".","gm")," ")
                    

                    【讨论】:

                    • 非常适合替换功能 =)
                    猜你喜欢
                    • 2014-10-26
                    • 1970-01-01
                    • 2022-01-19
                    相关资源
                    最近更新 更多