java教程

java 字符串截取 SubString(包括中文英文数字等)

位置:首页 > java教程 > java技巧,2018-01-07 10:25
java 字符串截取 SubString(包括中文英文数字等),不会因为是中文截取到半个字符而现面异常错误问题
public class SubString{

	 public SubString(){
	 }

	 public static void main(String args[]){
		 SubString s=new SubString();
		 System.out.println(s.getSubString("要要枯枯sd3333", 0,2));
	 }

	 public String getSubString(String str,int pstart,int pend){

	  String resu="";

	  int beg=0;

	  int end=0;

	  int count1=0;

	  char[] temp=new char[str.length()];

	  str.getChars(0,str.length(),temp,0);

	  boolean[] bol=new boolean[str.length()];

	  for(int i=0;i<temp.length;i++){

	   bol[i]=false;

	   if((int)temp[i]>255){//说明是中文

	    count1++;

	    bol[i]=true;

	   }

	  }

	  if(pstart>str.length()+count1){

	   resu=null;

	  }

	  if(pstart>pend){

	   resu=null;

	  }

	  if(pstart<1){

	   beg=0;

	  }else{

	   beg=pstart-1;

	  }

	  if(pend>str.length()+count1){

	   end=str.length()+count1;

	  }else{

	   end=pend;//在substring的末尾一样

	  }

	  //下面开始求应该返回的字符串

	  if(resu!=null){

	   if(beg==end){

	    int count=0;

	    if(beg==0){

	     if(bol[0]==true)

	      resu=null;

	     else

	      resu=new String(temp,0,1);

	    }else{

	     int len=beg;//zheli

	     for(int y=0;y<len;y++){//表示他前面是否有中文,不管自己

	      if(bol[y]==true)

	       count++;

	       len--;//想明白为什么len--

	     }

	     //for循环运行完毕后,len的值就代表在正常字符串中,目标beg的上一字符的索引值

	     if(count==0){//说明前面没有中文

	      if((int)temp[beg]>255)//说明自己是中文

	       resu=null;//返回空

	      else

	       resu=new String(temp,beg,1);

	     }else{//前面有中文,那么一个中文应与2个字符相对

	      if((int)temp[len+1]>255)//说明自己是中文

	       resu=null;//返回空

	      else

	       resu=new String(temp,len+1,1);

	     }

	    }

	   }else{//下面是正常情况下的比较

	    int temSt=beg;

	    int temEd=end-1;//这里减掉一

	    for(int i=0;i<temSt;i++){

	     if(bol[i]==true)

	      temSt--;

	    }//循环完毕后temSt表示前字符的正常索引

	    for(int j=0;j<temEd;j++){

	     if(bol[j]==true)

	      temEd--;

	    }//循环完毕后temEd-1表示最后字符的正常索引

	    if(bol[temSt]==true)//说明是字符,说明索引本身是汉字的后半部分,那么应该是不能取的

	    {

	     int cont=0;

	     for(int i=0;i<=temSt;i++){

	      cont++;

	      if(bol[i]==true)

	       cont++;

	     }

	     if(pstart==cont)//是偶数不应包含,如果pstart<cont则要包含

	      temSt++;//从下一位开始

	    }

	    if(bol[temEd]==true){//因为temEd表示substring 的最面参数,此处是一个汉字,下面要确定是否应该含这个汉字

	     int cont=0;

	     for(int i=0;i<=temEd;i++){

	      cont++;

	      if(bol[i]==true)

	       cont++;

	     }

	     if(pend<cont)//是汉字的前半部分不应包含

	      temEd--;//所以只取到前一个

	    }

	    if(temSt==temEd){

	     resu=new String(temp,temSt,1);

	    }else if(temSt>temEd){

	     resu=null;

	    }else{

	     resu=str.substring(temSt,temEd+1);

	    }

	   }

	  }
if(null==resu)resu="";
return resu;//返回结果
	 }

	}


TAGS:java 字符串截取

猜你喜欢


NewHot手机版