是这样子的,有一段文本,或者说是html代码字符串吧,现我要提取其中的有用信息如所有图片的名称组成数组输出,如何做到高效率呢?
如:
文本字符串:String str = "我要取下面标签img中的name1.jpg,<img height="800" width="600" src="/test/upload/image/name1.jpg" /><p>这是段落</p>我还要取下面的标签img中的name2.jpg,<img height="800" width="600" src="/test/upload/image/name2.jpg" />文本....";注:规定只取<img>标签中的图片名称,上面取完后输出应为:String[] result = {"name1.jpg","name2.jpg"};
当然上面只是说明方便,实际中文本比这复杂多了,我的算法感觉效率很差,我是这样做的:
先用:indexOf("<img")找到第一个img位置(索引),然后再找此索引的下一下:/>,然后之间组成一个字符串,再用类似方法,找到name1.jpg并存入result中,接着再找第二个<img...以此类推,直到找完为止...呵,总感觉这样做有点笨,很老土,受思想与水平限制,没想到更高效的方法,请大侠们指教了....

解决方案 »

  1.   

    哈哈, 建议用 var imgs = document.getElementsByTagName('img');  再用for 遍历数组。 img.src得到 再用split('/') 取最后一个。
    也可以用正规(上面方法是首选,自己感觉),正规已经有帖子了,我等下给你找。
      

  2.   

    晕, 看错了 是JAVA 的。  不好意思。  
    那就用正则匹配!我晕, 我倒!
      

  3.   

    一看到<img height="800" width="600" src="/test/upload/image/name1.jpg" />就想起JS了, - -`
      

  4.   

    呵,var imgs = document.getElementsByTagName('img');
    这个方法只能在js中用吧,我要在java里使用,  当然非要在js中算好后再传到后台服务器也行...
      

  5.   

    这个,html也是一个xml对象,可以使用 DOM 模型来读取 ,看看java 操作xml 的DOM 部分一切就迎刃而解了,呵呵
      

  6.   

    用正则表达式,大致这样(手写的没有到工具中验证,只是表达这个意思):Pattern p=Pattern.parse("<img.*?name=['\"](.*?)['\"].*?>");
    //表达式说明
    // <img             .*?                        name=        ['\"]                          
    // 匹配img标签的开始  匹配任意字符,?为非贪婪模式                   匹配引号      
    // (.*?) 这是真正的名字,用括号是为了将名字捕获为一个分组,以方便后面用group方法取出值来str="我要取下面标签img中的name1.jpg, <img height="800" width="600" src="/test/upload/image/name1.jpg" /> <p>这是段落 </p>我还要取下面的标签img中的name2.jpg, <img height="800" width="600" src="/test/upload/image/name2.jpg" />文本....";Mather m=p.matches(str);Vector v=new Vector();
    while(m.find()){
      v.add(m.group(1));
    }
      

  7.   

    呵,还真有简单的方法,多谢,又学了一招了...
    不过正则表达式之前少接触,我要慢慢的去领会了,我想先得到结果,然后再
    仔细的研究下,你的代码可能有出入吧,Pattern.parse这个方法不存在(我用的是jdk1.6,不知道你是不是早期的版本?)
    我改的代码如下:
    import java.util.Vector;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class GetImaNameVector
    {
    public static void main(String[] args)
    { Pattern p = Pattern.compile("<img.*?name=['\"](.*?)['\"].*?>"); //我用compile方法,这句跟你的有出入 String str = "我要取下面标签img中的name1.jpg, <img height=\"800\" width=\"600\" src=\"/test/upload/image/name1.jpg\" /> <p>这是段落 </p>我还要取下面的标签img中的name2.jpg, <img height=\"800\" width=\"600\" src=\"/test/upload/image/name2.jpg\" />文本....";  Matcher m = p.matcher(str);  Vector v = new Vector();  while (m.find())//没找到值,一直为假,那里出问题了呢

      v.add(m.group(1)); 
      System.out.println("找到值为:"+m.group(1));//无值
    }  }
    }
    代码可直接拷贝使用,各位有空再帮我看下哪里漏了.(由于关于正则这方面的知识,以前没怎么接触,自己也要去补补课了,呵,但还是希望这个结果先出来感觉学起来更有成就感些的,呵,再谢了.)
      

  8.   

    不好意思:
    Pattern p = Pattern.compile(" <img.*?name=['\"](.*?)['\"].*?>"); //我用compile方法,这句跟你的有出入 
    这句中的name应该改为:src,这样,可以得到整个:src的值了,得到的为:
    /test/upload/image/name1.jpg与/test/upload/image/name2.jpg,
    这样,基本上是完成了,我再用字符串的方面取:name1.jpg和name2.jpg,我是想能不能直接得到name1.jpg和name2.jpg呢?
    当然应该可以的,只是(.*?)这个怎么写了?一时搞不定....
      

  9.   

    行了,试出来了,是这样子的:
    Pattern p = Pattern.compile("<img.*?src=['\"]/test/upload/image/(.*?)['\"].*?>"); 
    感觉楼上的各位,就此结了...