字符串分析问题 我想截取一段内容中的一部分,比如截取300个字,str.substring(0,300); 但是str中有可能包含图片内容,比如:<img xxxx />,现在的难点是要把一张图片当做100个字来算。比如有2个图片标签,就是100个字和2个图片等于300,请大家给个处理的思路 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 字按一个一个算,如果遇到IMG标签,无论IMG标签多长都算100个字,这样? <img xxxx />标签可以通过indexOf查找起始和结束标识就好了但我有个问题,如果前边有250个字,这时候来了个图片标签,这时要怎么处理?是读,还是不读? int a = str.indexOf(图片形式);if为-1,直接str = str.substring(0,300);else 判断下a + 100 > 300,亚日提的是个问题啊,你到底是要正好取300个的话,那怎么算?需求不明确 需要确认一下:比如当取到了2百多个字符的时候,出现了图片!你是想怎么处理,还要存图片吗?可以先查看第一张图片出现在字符串的什么位置,如果出现在300字符以后的就直接str.substring(0,300);要是出现在200—300字符之间(需要确认一下:比如当取到了2百多个字符的时候,出现了图片!你是想怎么处理,还要存图片吗?)出现在100-200之间,就直接取。再判断一下第二张图片的位置! 练练手 public static void test(){ int size=30,imgSize=10; String str="123456<img />789203<img />111"; String result=str.replaceAll("<img[^>]+?>", new String(new char[imgSize]).replace((new char[1])[0], '#')); if (result.length()>size)result=result.substring(0,size); Matcher m=Pattern.compile("<img[^>]+?/>").matcher(str); while(m.find()){ result=result.replaceFirst("[#]{1,"+imgSize+"}", m.group()); } System.out.println(result); result=str.replaceAll("<img[^>]+?>", new String(new char[imgSize]).replace((new char[1])[0], '#')); if (result.length()>size)result=result.substring(0,size); m=Pattern.compile("<img[^>]+?/>").matcher(str); while(m.find()){ result=result.replaceFirst("[#]{"+imgSize+"}", m.group()); } System.out.println(result.replace("#", "")); } public class test{ public static String subStr(String str){ String str1[]=new String[3]; String newStr=""; if(str!=null&&!str.equals("")){ str=str.replace("<IMG", "<img"); int length=str.indexOf("<img"); if(length==-1||length>300){ newStr=str.substring(0, 30); }else{ while(length<300){ str1=test.savePic(str, length); if(str1[0]!=null&&!str1[0].equals("")){//判断有没有图片在300字符 if(Integer.parseInt(str1[1])<300-length){ newStr+=str1[0];//获取图片前面的字符串和图片 length+=100+Integer.parseInt(str1[1]); str=str1[2]; } }else{ break; } } } } return newStr; } public static String[] savePic(String str1,int i){ String str[]=new String[3]; if(str1.indexOf("<img")!=-1&&str1.indexOf(">")!=-1){ if(str1.indexOf("<img")<=300-i){ String place=str1.substring(0,str1.indexOf(">")+1);//把图片的路径取出来 System.out.println(place); str[0]=place;//存图片和图片前面的字符串 str[1]=(String.valueOf(str1.indexOf(">")+1));//图片在str的位置存进去! str1=str1.substring(str1.indexOf(">")+1,str1.length());//在str上去掉图片和图片之前的字符 str[2]=str1;//最新的str存进去 } } return str; } public static void main(String arg[]){ String str="可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字<img src='/img/iii.gif>符串的什么位置,如果可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字<IMG src='/img/iii.gif>出现在300字符以后的就直接str.substring(0,300)"+ "要是出现在200—300字符之间<img src='/img/iii.gif>'(需要确认一下:!"; System.out.println(test.subStr(str)); } }新手写的代码!!可以试试!再请教各位大哥,我写的代码是不是很没有水准,感觉和别人写的就是差很多!我应该怎么改进!!希望大哥们给我讲讲 思路分析:为方便试验,把楼主要求的数值除以10,即,选取30个字符,每个图片当作10个字符.先设置要选取的字符数length_sel为30,再判断第一个"<img"及"/>"所在的位置,如果没有或者第一个"<img"在length_sel个字符之外,那就直接选取length_sel个字符.如果第一个"<img"在length_sel个字符之内,就把需要选取的长度length_sel减去10后再加上"<img"和"/>"之间这一串字符的长度,如果"<img"的位置在length_sel-10和length_sel之间,那length_sel就为"/>"的位置.之后再判断第二个"<img"及"/>"所在的位置,一直循环,直到没有或者"<img"在length_sel个字符之外.源全码如下:package test;import java.lang.String;class main { public static void main(String[] args){ int length_sel = 30; int length_begin = 0; int length_end = 0; String str = "12345<IMG dssf/><IMG dssf/>6789<IMG dssf/>0123456789012345678901234567890"; String str_sel; str = str.replaceAll("<IMG", "<img"); while(true) { length_begin = str.indexOf("<img", length_end); length_end = str.indexOf("/>", length_begin); if( length_sel < length_begin || -1 == length_begin ) { break; } if( length_begin > length_sel - 10 ) { length_sel = length_end + 2; } else { length_sel = length_sel - 8 + length_end - length_begin; } } str_sel = str.substring(0, length_sel); System.out.println(str_sel); }} 对于回调方式,如何反射? 小程序结果没有正确输出 API和MFC的意思? java程序开机自动运行 文字列连接效率的问题(a+b ? a.concat(concat)? 还是用StringBuffer) BigDecimal的 Scale 到底是什么````````` 新手求救.... java,如何读取已安装IE证书信息 ? 急~ 在线等 ! ~ 如何取到当前日期前推30天的时间? 用 synchronized 关键字怎么没效果?请高手指点这一段小小小小的程序 线程同步问题,高手看看啊,哪里有问题啊,谢谢了 关于LDAP连接的问题
标签可以通过indexOf查找起始和结束标识就好了但我有个问题,如果前边有250个字,这时候来了个图片标签,这时要怎么处理?
是读,还是不读?
if为-1,直接str = str.substring(0,300);
else
判断下a + 100 > 300,亚日提的是个问题啊,你到底是要正好取300个的话,那怎么算?
需求不明确
比如当取到了2百多个字符的时候,出现了图片!你是想怎么处理,还要存图片吗?可以先查看第一张图片出现在字符串的什么位置,如果出现在300字符以后的就直接str.substring(0,300);
要是出现在200—300字符之间(需要确认一下:
比如当取到了2百多个字符的时候,出现了图片!你是想怎么处理,还要存图片吗?)
出现在100-200之间,就直接取。再判断一下第二张图片的位置!
public static void test(){
int size=30,imgSize=10;
String str="123456<img />789203<img />111";
String result=str.replaceAll("<img[^>]+?>", new String(new char[imgSize]).replace((new char[1])[0], '#'));
if (result.length()>size)result=result.substring(0,size);
Matcher m=Pattern.compile("<img[^>]+?/>").matcher(str);
while(m.find()){
result=result.replaceFirst("[#]{1,"+imgSize+"}", m.group());
}
System.out.println(result); result=str.replaceAll("<img[^>]+?>", new String(new char[imgSize]).replace((new char[1])[0], '#'));
if (result.length()>size)result=result.substring(0,size);
m=Pattern.compile("<img[^>]+?/>").matcher(str);
while(m.find()){
result=result.replaceFirst("[#]{"+imgSize+"}", m.group());
}
System.out.println(result.replace("#", ""));
}
public static String subStr(String str){
String str1[]=new String[3];
String newStr="";
if(str!=null&&!str.equals("")){
str=str.replace("<IMG", "<img");
int length=str.indexOf("<img");
if(length==-1||length>300){
newStr=str.substring(0, 30);
}else{
while(length<300){
str1=test.savePic(str, length);
if(str1[0]!=null&&!str1[0].equals("")){//判断有没有图片在300字符
if(Integer.parseInt(str1[1])<300-length){
newStr+=str1[0];//获取图片前面的字符串和图片
length+=100+Integer.parseInt(str1[1]);
str=str1[2];
}
}else{
break;
}
}
}
}
return newStr; }
public static String[] savePic(String str1,int i){
String str[]=new String[3];
if(str1.indexOf("<img")!=-1&&str1.indexOf(">")!=-1){
if(str1.indexOf("<img")<=300-i){
String place=str1.substring(0,str1.indexOf(">")+1);//把图片的路径取出来
System.out.println(place);
str[0]=place;//存图片和图片前面的字符串
str[1]=(String.valueOf(str1.indexOf(">")+1));//图片在str的位置存进去!
str1=str1.substring(str1.indexOf(">")+1,str1.length());//在str上去掉图片和图片之前的字符
str[2]=str1;//最新的str存进去
}
}
return str;
}
public static void main(String arg[]){
String str="可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字<img src='/img/iii.gif>符串的什么位置,如果可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字可以先查看第一张图片出现在字<IMG src='/img/iii.gif>出现在300字符以后的就直接str.substring(0,300)"+
"要是出现在200—300字符之间<img src='/img/iii.gif>'(需要确认一下:!";
System.out.println(test.subStr(str));
}
}
新手写的代码!!可以试试!
再请教各位大哥,我写的代码是不是很没有水准,感觉和别人写的就是差很多!
我应该怎么改进!!希望大哥们给我讲讲
为方便试验,把楼主要求的数值除以10,即,选取30个字符,每个图片当作10个字符.
先设置要选取的字符数length_sel为30,再判断第一个"<img"及"/>"所在的位置,如果没有或者第一个"<img"在length_sel个字符之外,那就直接选取length_sel个字符.
如果第一个"<img"在length_sel个字符之内,就把需要选取的长度length_sel减去10后再加上"<img"和"/>"之间这一串字符的长度,如果"<img"的位置在length_sel-10和length_sel之间,那length_sel就为"/>"的位置.
之后再判断第二个"<img"及"/>"所在的位置,一直循环,直到没有或者"<img"在length_sel个字符之外.源全码如下:
package test;import java.lang.String;class main { public static void main(String[] args){
int length_sel = 30;
int length_begin = 0;
int length_end = 0;
String str = "12345<IMG dssf/><IMG dssf/>6789<IMG dssf/>0123456789012345678901234567890";
String str_sel;
str = str.replaceAll("<IMG", "<img");
while(true)
{
length_begin = str.indexOf("<img", length_end);
length_end = str.indexOf("/>", length_begin);
if( length_sel < length_begin || -1 == length_begin )
{
break;
}
if( length_begin > length_sel - 10 ) {
length_sel = length_end + 2;
}
else {
length_sel = length_sel - 8 + length_end - length_begin;
}
}
str_sel = str.substring(0, length_sel);
System.out.println(str_sel);
}
}