【问题标题】:JavaScript/jQuery: Replace 2nd, 3rd, etc space with   but not the first one in textJavaScript/jQuery:将第二个、第三个等空格替换为,但不是文本中的第一个
【发布时间】:2017-06-12 12:53:48
【问题描述】:

如何将所有空格替换为  而不是第一个(不是空格之后的第一个)。

例如,这个字符串:

var str = "hello     how are you    doing?  "

应该改为

"hello     how are you    doing?  "

如您所见,第一个空格被保留。

例如,

str.split(' ').join(' ')

会将所有' ' 替换为 

【问题讨论】:

    标签: javascript jquery string replace preg-match


    【解决方案1】:
    str.replace(/  +/g, function(match) {
       return " " + Array(match.length).join(' ');
    });
    

    这使用replace 的版本,该版本接受一个生成替换的函数作为第二个参数,并将每次出现的2 个或更多空格替换为单个空格,后跟适当数量的 

    有一个String.prototype.repeat 函数,但它在 IE 中不受支持,因此您现在可能需要使用另一种方法来生成  的序列。 Array(match.length).join(' ') 是将来自this answer 的字符串重复到另一个问题的简短方法。

    作为替代方案,您可以使用此函数来执行重复,同样取自Repeat String 问题:

    function repeat(pattern, count) {
        if (count < 1) return '';
        var result = '';
        while (count > 1) {
            if (count & 1) result += pattern;
            count >>= 1, pattern += pattern;
        }
        return result + pattern;
    }
    

    注意Array(n).join 您无需从匹配长度中减去 1 即可获得正确数量的不间断空格。例如Array(3).join('&amp;nbsp;')"&amp;nbsp;&amp;nbsp;" 但对于生成重复字符串的其他方法,您需要比匹配长度小 1。

    【讨论】:

      【解决方案2】:

      如果您想获得基本知识,可以尝试以下类似的方法,其灵感来自 this answer,以及 Ates Goral 的评论(单独的实用函数,而不是扩展基本字符串类)。应该适用于所有浏览器:

      var str = "some    words    here";
      var first = true;
      for (var i=0; i<str.length; i++) {
        if (str[i] == " " && !first) {
          str = fix(str, i, '\u00A0'); //insert unicode for &nbsp;
        } else if (str[i] == " " && first) {
          first = false;
        } else if (str[i] != " ") {
          first = true;
        }
      }
      
      function fix(s, index, character) {
        return s.substr(0, index) + character + s.substr(index+character.length);
      }
      

      由于字符串是不可变的,因此每次进行更改时都必须返回整个(修改后的)字符串,并将其放入 str 变量中。

      【讨论】:

        【解决方案3】:

        这个函数会做的

        function myFunction() {
                    var str = "hello     how are you    doing?  ";
                    var patt1 = /\s{2,}/g; 
                    var result = str.replace(patt1,function(filtered){
                        return " " + Array(filtered.length).join('&nbsp;')
                    }));
                    document.getElementById("demo").innerHTML = result;
                    console.log(result)
        }
        

        但你不会看到任何影响,因为我正在写文件 但是如果你写到控制台你肯定会看到效果

        edit-1 感谢mikej在我的代码中指出错误,我的小sn-p实际上和他的一样。他的回答比这里提供的更准确,信息也更多,

        answer By mikej

        【讨论】:

        • 这不是用一个空格后跟一个&amp;nbsp; 替换超过2 个空格,而不是用&amp;nbsp; 替换第一个空格之后 之后的每个空格吗?跨度>
        • 是的,很抱歉没有注意到,:( 在那种情况下我必须编辑它。感谢您的提醒
        • 在这种情况下,我将使用与您相同的代码并感谢您,希望您不会介意
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        相关资源
        最近更新 更多