如题,但是截取字符串有要求:1.将一段长文本截成N段相等的子串。
2.如果是数值,则不截断字值
3.如果截取后的字符串中含回车、换行,则直接从回车换行部份截取
4.如果截取后的子串的下了一个子串是以标点符号开头号,则标点记入上个子串。请高人指点~~谢谢~~

解决方案 »

  1.   

    问题表述不清楚,LZ请根据2L说的再细些
      

  2.   

    不好意思表述没清楚,产生歧义了。现在补充如下:我想实现的功能:有一文本串,我需要将其按行写,每一行,只显示60个字符。现在需要用JS来实现。规则:
    1.截取子串时,是数字部分不能分离:如“abc123” === >>不能截成:“abc1”,"23"
    2.如果截取的子串中有回车或者换行,只截取至回车或换行符:如“abc\r\nefd"===>截取四个字符时,第一次只取“abc”,第二次“efd”
    3.因为长串中是含中文 字符,截取中文字符按二个字符算 。
    4.如果截取的子串中,对标点的处理,不能让标点显示的行的首字符,如:“abc,efg”==>截取三个字符时,第一次:“abc,”,第二次efg""不知道我现在描述清楚没有。我试过几次,都没能很好的实现这个业务 ,忘高手指点~~
      

  3.   


    var perlen = 60;
    function splitestring(srcstr){
         var result=[];
              for(var i=0,j=0,k=0,temp="";i<srcstr.length;i++){
             if(srcstr[i]=='\n'||srcstr[i]=='\r'){
                j=0;result[k] = temp;temp = "";k++;
             }
             else if (j==perlen-1) {
                    temp = temp +srcstr[i];
                    if(isNum(srcstr[i])){
                        i++;
                        while(i<srcstr.length && isNum(srcstr[i])){
                            temp = temp + srcstr[i];i++;
                        }
                        i--;
                    }
                    else if(isBiaoDian(srcstr[i+1])){
                        i++;temp = temp + srcstr[i];
                    }
                    j=0;result[k] = temp;temp = "";k++;
             }
             else{
                temp = temp +srcstr[i];
                j++;
             }     }
         if(j>0)result[k] = temp;
         return result;
    }
    function isNum(s) {
          if (s-0<=9 && s-0 >=0) {
                return true;
          }
          return false;
    }
    function isBiaoDian(s) {
           var str=",.';:";
           if(str.indexOf(s)>=0)
                   return true;
           return false;
    }//test
    var result = splitestring("abcd234fghijk");
    alert(result);
    大致实现了你的要求,标点符号的定义你可以在isBiaoDian中加。
      

  4.   

    goldlevi,谢谢~~实际 应用中,是有中文 字符的。
    需要做特殊 处理,中文 字符需按二个字节算。
    明天 我也再测试一下~~tks~~~
      

  5.   

    哥抛砖引玉 window.onload=function(){
    alert("01234567890123456781231231231239\r\na\r\naaaaf\r\n!hdfghfffd".truncate("3"));
    }
    String.prototype.truncate=function(n){
    if(!this||!n||!(/^\d+$/.test(n.toString()))){
    alert("n必须是整数且字符串不能空");
    return;
    }
    var rowLength=Math.floor(this.length/n);
    var results=new Array();
    var start=0;
    var end = 0;
    while(start<this.length){
    var regNum=new RegExp("\\d+","gi");
    var temp=this.substring(start,Math.min(start+2*rowLength,this.length));
    var arr=regNum.exec(temp);
    var numIndex=regNum.lastIndex;
    if(numIndex>rowLength){
    end=numIndex+start;
    }
    var regCar=new RegExp("[\\r\\n]+","gi");
    arr=regCar.exec(temp);
    var carIndex=regCar.lastIndex;
    if(carIndex>0&&numIndex==carIndex-(arr==null?0:arr[0].length)){
    end=carIndex+start;
    }else if(end!=carIndex-(arr==null?0:arr[0].length)+start&&carIndex>0){
    end=carIndex+start;
    }
    var regSign=new RegExp("[,.?\";\'!:]+","gi");
    arr=regSign.exec(temp);
    var signIndex=regSign.lastIndex;
    if(signIndex>0&&signIndex-(arr==null?0:arr[0].length)===carIndex||signIndex-(arr==null?0:arr[0].length)===carIndex){
    end=signIndex+start;
    }
    if(start==end){
    end=Math.min(start+rowLength,this.length);
    }

    results.push(this.substring(start,end));
    start=end;
    delete arr;
    delete numIndex;
    delete carIndex;
    delete signIndex;
    delete regNum;
    delete regCar;
    delete regSign;
    }
    return results;
    }
    </script>