如何在javascript中每n个字符后插入一个字符?
Posted
技术标签:
【中文标题】如何在javascript中每n个字符后插入一个字符?【英文标题】:How can I insert a character after every n characters in javascript? 【发布时间】: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.$"
目标是使用此函数将­ 插入到长字符串中以允许它们换行。
也许有人知道更好的方法?
【问题讨论】:
你最好让浏览器换行。您是否有像上面示例中使用的长句子或长词? 浏览器不会包含在一个单词中,我有很长的单词,例如“ThisIsAStupidLabelThatOneOfMyUsersWillTryToMakeInMyApplication” 将单词分解为最多 n 个字符的服务器端解决方案不是更好吗? 可能,但是对于我目前的困境来说,客户端解决方案更容易实现。 【参考方案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://***.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
用于移动应用程序,但使用Array 和reduce。
这将接受一个字符串,检查每个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.$"
【讨论】:
以上是关于如何在javascript中每n个字符后插入一个字符?的主要内容,如果未能解决你的问题,请参考以下文章