【问题标题】:How can I insert a character after every n characters in javascript?如何在javascript中每n个字符后插入一个字符?
【发布时间】:2009-11-20 20:07:49
【问题描述】:

我有一个字符串: “敏捷的棕色狐狸跳过懒惰的狗。”

我想使用 JavaScript(可能使用 jQuery)在每个 n 个字符中插入一个字符。比如我想打电话:

var s = "The quick brown fox jumps over the lazy dogs.";
var new_s = UpdateString("$",5);
// new_s should equal "The q$uick $brown$ fox $jumps$ over$ the $lazy $dogs.$"

目标是使用此函数将&shy 插入到长字符串中以允许它们换行。

也许有人知道更好的方法?

【问题讨论】:

  • 你最好让浏览器换行。您是否有像上面示例中使用的长句子或长词?
  • 浏览器不会包含在一个单词中,我有很长的单词,例如“ThisIsAStupidLabelThatOneOfMyUsersWillTryToMakeInMyApplication”
  • 将单词分解为最多 n 个字符的服务器端解决方案不是更好吗?
  • 可能,但是对于我目前的困境来说,客户端解决方案更容易实现。

标签: javascript string


【解决方案1】:

使用正则表达式

"The quick brown fox jumps over the lazy dogs.".replace(/(.{5})/g,"$1$")

The q$uick $brown$ fox $jumps$ over$ the $lazy $dogs.$

干杯,

【讨论】:

  • 该死!那里有很好的正则表达式。 BTW 是替换字符串中需要的最后一个$
  • 替换字符串中的最后一个 $ 是不需要的,你可以在此处以 5 个空格间隔放任何你想放的东西,例如
    例如。
  • 我到达"string".replace(/.{5}/g, "$&" + "<br>");。最后的连接只是为了使其更易于阅读。替换中的$& 匹配匹配的字符串,因此不需要分组。
  • 从字符串末尾开始计数时如何工作?
  • 太棒了。一个重要的注意事项是如果字符串包含换行符,这将从每行开头的零开始计数,因为. 不匹配\n\r。这非常适合折叠长行的明文,但可能不适用于 Web 内容。要在匹配中包含换行符,请使用 /[\s\S]{5}/g
【解决方案2】:
function chunk(str, n) {
    var ret = [];
    var i;
    var len;

    for(i = 0, len = str.length; i < len; i += n) {
       ret.push(str.substr(i, n))
    }

    return ret
};

chunk("The quick brown fox jumps over the lazy dogs.", 5).join('$');
// "The q$uick $brown$ fox $jumps$ over$ the $lazy $dogs."

【讨论】:

  • @Andy E:嘿,在结束 } 之前它们是可选的。我什至没有意识到我已经这样做了。它源于 js 压缩器成为标准之前的“必须保存每个字节”的心态;)
  • String.split("") & Array.form()
  • 正则表达式 & string.split() & array.form() & slice() & map() & JSON.parse()
【解决方案3】:

保持简单

  var str = "123456789";
  var parts = str.match(/.{1,3}/g);
  var new_value = parts.join("-"); //returns 123-456-789

【讨论】:

  • 万一我有一个十个字母的数字,我只想在第 3 和第 6 个字母之后有“-”!而不是第 9 个字母。
  • @Learner 使用正则表达式删除最后一个“-”。
  • 你能分享一下吗?提前致谢。
  • "123-456-789-0".replace(/-([^-]+)$/, '$1'); //删除最后一个破折号
  • 喜欢这个想法。这也可以即时完成(当用户仍在打字时)?
【解决方案4】:
let s = 'The quick brown fox jumps over the lazy dogs.';
s.split('').reduce((a, e, i)=> a + e + (i % 5 === 4 ? '$' : ''), '');

说明:split('') 将字符串转换为数组。现在我们想把数组变回一个字符串。 Reduce 在这种情况下是完美的。 Array的reduce函数有3个参数,第一个是累加器,第二个是迭代元素,第三个是索引。由于数组索引是基于 0 的,要在第 5 次之后插入,我们正在查看索引 i%5 === 4。

【讨论】:

  • 非常感谢您提供此代码。这是代码,根据您的代码,我使用每 2 个字符添加一个空格来输入电话号码(keyup 事件):~~~ $(this).val( $(this).val().replace(/ /g,"").split('').reduce((a,e,i) => a + e + (i % 2 === 1 ? ' ': ''),'').trim( )); ~~~
【解决方案5】:
var str="ABCDEFGHIJKLMNOPQR";
function formatStr(str, n) {
   var a = [], start=0;
   while(start<str.length) {
      a.push(str.slice(start, start+n));
      start+=n;
   }
   console.log(a.join(" "));
}
formatStr(str,3);

【讨论】:

  • 试着解释你的答案
【解决方案6】:
function addItemEvery (str, item, every){
  for(let i = 0; i < str.length; i++){
    if(!(i % (every + 1))){
      str = str.substring(0, i) + item + str.substring(i);
    }
   }
  return str.substring(1);
}

结果:

> addItemEvery("The quick brown fox jumps over the lazy dogs.", '$', 5)
> "The q$uick $brown$ fox $jumps$ over$ the $lazy $dogs."

【讨论】:

    【解决方案7】:

    这是以前的答案之一,但我将它包装在一个函数中,并给它一个“偏移”参数而不是硬编码。

    // https://stackoverflow.com/a/2712896/3480193
    addCharToStringEveryXSpots(str, char, offset) {
        if ( ! char ) {
            return str;
        }
        
        let regExPattern = new RegExp('(.{' + offset + '})', 'g');
        
        return str.replace(regExPattern, '$1' + char);
    };
    

    【讨论】:

      【解决方案8】:

      我做了类似的事情,将friendCode 用于移动应用程序,但使用Arrayreduce

      这将接受一个字符串,检查每个n 字符并在该位置添加分隔符。

      /**
       * A function to easily inject characters every 'n' spaces
       * @param {string} friendCode The string we want to inject characters in
       * @param {*} numDigits Determines the 'n' spaces we want to inject at
       * @param {*} delimiter The character(s) we want to inject
       */
      function formatFriendCode(friendCode, numDigits, delimiter) {
        return Array.from(friendCode).reduce((accum, cur, idx) => {
          return accum += (idx + 1) % numDigits === 0 ? cur + delimiter : cur;
        }, '')
      }
      
      formatFriendCode("000011112222", 4, ' ')
      // output "0000 1111 2222 "
      
      formatFriendCode("The quick brown fox jumps over the lazy dogs.", 5, '$')
      // output "The q$uick $brown$ fox $jumps$ over$ the $lazy $dogs.$"
      

      【讨论】:

        猜你喜欢
        • 2015-03-13
        • 2017-08-24
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多