我有一串文字,我希望在javascript中每隔60个字符通过代字号(〜)进行分割。
我有;
UXXXXXXquXXX pXXXtXXXXXXXXXt ID:〜XXXTEST COPYXXX〜XXXGXXXstrosXXXopy RXXXportXXX〜NXXXXXXXXX:XXXDELTAXXX,DXXXXXXsy〜CXXXsXXX XXXotXXX XXXo:XXX999999999XXX〜45678:XXXXXX〜DXXXtXXX oXXX XXXXXXrtXXX:XXX18 \ 12个\ 1968XXX〜AXXXXXXrXXXss:TXXXXXX NXXXw StrXXXXXXt,TXXXXXX ArXXXXXX,CXXXXXXstXXXr ,。 CZZZL~ZZ:TEST,TXXXXXX GrXXXXXXt SuttoXXX MXXXXXX.Ctr。 (XXXXXXuXXX),TXXXXXX GrXXXXXXt SuttoXXX MXXXXXX.Ctr,OXXXXXX CXXXXXXstXXXr RoXXXXXX,GrXXXXXXt SuttoXXX,EXXXXXXXXXsXXXXXXrXXX端口,ZZZ ZPB〜XXXProXXXXXXXXXurXXX XXXXXXtXXX:XXX 29 \ 03 \ 2016〜XXXStXXXtus:XXX〜XXXWXXXrXXX:XXX(XXXoXXXXXX)〜XXXBUILDINGXXXtXXXXXX:XXX CouXXXtXXXss oXXX CXXXXXXstXXXr~XXXRXXXXXXXXXrrXXXXXXXXX XXXoXXXsuXXXtXXXXXXt:XXX ZZ (GPwer)〜XXXCoXXXsuXXXtXXXXXXt \ EXXXXXXosXXXopXXXst:XXX LXXXst XXXoXXXsuXXXtXXXXXXt:XXX EXXXXXXosXXXopXXXst NO1:先生ZZZ vXXXXXXs HelloXXXs:NXXXXXXoXXXXXX AsXXX StXXXXXXXXXXXX BXXXzXXXXXXt〜XXXIXXXstruXXXXXXXXXt:XXX 11 GIF1T240 2130131〜XXXPrXXXXXXXXXXXXXXXXXXXXXtXXXoXXX:XXX〜XXXIXXXXXXXXXXXXXXXtXXXoXXXs:XXX〜XXXRXXXport:XXX TXXXXXX proXXXXXXXXXurXXX wXXXs XXXoXXXpXXXXXXtXXXXXX suXXXXXXXXXssXXXuXXXXXXy到D2。 ~XXXDXXXXXXXXXXXXosXXXs:XXX~XXXTXXXXXXrXXXpXXXutXXXXXX proXXXXXXXXXurXXXs:XXX~XXXSpXXXXXXXXXXXXXXXXXXX TXXXXXXXXXXXX:XXX~XXXMXXXXXXXXXXXXXXXX:XXX~XXXFollow up:XXX~XXXAdvice \ comments:XXX~
该字符串有多个代字号,这很好,很高兴保留原样。但在某些情况下,如果波形符之间的字符数大于60,我想通过在第60个字符点添加另一个波形符来拆分该部分(波浪号到波浪号)。并重新开始,到下一个代字号。
基本上每个代字号之间不应该有超过60个字符,不过少就可以了。
尝试了很多功能,最后一次。
function addtilde(str) {
var result = '';
while (str.length > 0) {
result += str.substring(0, 60) + "~";
str = str.substring(60);
}
return result;
}
没有快乐,任何想法都会受到最高的赞赏。
答案 0 :(得分:2)
对该字符串使用replace
。它是一个单行代码,可以查找"没有代字号,最多可达60次,可选后跟代字号"并返回非波浪部分加上波形符。
str = str.replace ("([^\~]{1,60})\~?",
function (fullmatch, partmatch) { return partmatch+'~'; }, "g");
答案 1 :(得分:0)
这是一个有趣的小递归解决方案。在字符串中使用方便的.indexOf
方法,它采用第二个参数来指示字符串搜索的起始索引。
Haven未经过测试,但应该可以正常使用。 :)
function splitItUp(string, start) {
if (start > string.length - 60) return string;
var indexOf = string.indexOf('~', start);
if (indexOf - start > 60 || indexOf === -1) {
// insert the character
string = string.substring(0, start + 60) + '~' + string.substring(start+60);
}
return splitItUp(string, start+60);
}
通过电话启动递归
var res = splitItUp("my string", 0);
然后返回结果。
答案 2 :(得分:0)
递归执行非常有趣(使用ES6语法简洁):
var splitRun = txt => txt.length <= 60
? txt
: (txt.substring(0,60) + "~" + splitRun(txt.substring(60)));
var runs = originalText.split("~");
var treatedText = runs.map(splitRun).join("~");
否则,您可以按如下方式在ES5语法中重新设置splitRun
:
var splitRun = function(txt){
return txt.length <= 60
? txt
: (txt.substring(0,60) + "~" + splitRun(txt.substring(60)));
}
答案 3 :(得分:0)
您可以匹配正则表达式,它匹配从1到n的任意数量的字符,在本例中为60.然后使用相同的标记重新加入它。
str = "UXXXXXXquXXX pXXXtXXXXXXXXXt ID: ~XXXTEST COPYXXX~XXXGXXXstrosXXXopy RXXXportXXX~NXXXXXXXXX: XXXDELTAXXX,DXXXXXXsy~CXXXsXXX XXXotXXX XXXo: XXX999999999XXX~45678: XXXXXX~DXXXtXXX oXXX XXXXXXrtXXX: XXX18\12\1968XXX~AXXXXXXrXXXss: TXXXXXX NXXXw StrXXXXXXt, TXXXXXX ArXXXXXX, CXXXXXXstXXXr, . CZZZL~ZZ: TEST, TXXXXXX GrXXXXXXt SuttoXXX MXXXXXX.Ctr. (XXXXXXuXXX), TXXXXXX GrXXXXXXt SuttoXXX MXXXXXX.Ctr., OXXXXXX CXXXXXXstXXXr RoXXXXXX, GrXXXXXXt SuttoXXX, EXXXXXXXXXsXXXXXXrXXX Port, ZZZ ZPB~XXXProXXXXXXXXXurXXX XXXXXXtXXX:XXX 29\03\2016~XXXStXXXtus:XXX ~XXXWXXXrXXX:XXX (XXXoXXXXXX)~XXXBUILDINGXXXtXXXXXX:XXX CouXXXtXXXss oXXX CXXXXXXstXXXr~XXXRXXXXXXXXXrrXXXXXXXXX XXXoXXXsuXXXtXXXXXXt:XXX ZZ (GPwer)~XXXCoXXXsuXXXtXXXXXXt\EXXXXXXosXXXopXXXst:XXX LXXXst XXXoXXXsuXXXtXXXXXXt:XXX EXXXXXXosXXXopXXXst No1: Mr ZZZ vXXXXXXs HelloXXXs: NXXXXXXoXXXXXX AsXXX StXXXXXXXXXXXX BXXXzXXXXXXt~XXXIXXXstruXXXXXXXXXt:XXX 11 GIF1T240 2130131~XXXPrXXXXXXXXXXXXXXXXXXXXXtXXXoXXX:XXX ~XXXIXXXXXXXXXXXXXXXtXXXoXXXs:XXX ~XXXRXXXport:XXX TXXXXXX proXXXXXXXXXurXXX wXXXs XXXoXXXpXXXXXXtXXXXXX suXXXXXXXXXssXXXuXXXXXXy to D2. ~XXXDXXXXXXXXXXXXosXXXs:XXX ~XXXTXXXXXXrXXXpXXXutXXXXXX proXXXXXXXXXurXXXs:XXX ~XXXSpXXXXXXXXXXXXXXXXXXs TXXXXXXXXXXXX:XXX ~XXXMXXXXXXXXXXXXXXXtion:XXX ~XXXFollow up:XXX ~XXXAdvice\comments:XXX ~"
console.log(str.match(/[^~]{1,60}/g).join('~'));