是这样子的,有一段文本,或者说是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...以此类推,直到找完为止...呵,总感觉这样做有点笨,很老土,受思想与水平限制,没想到更高效的方法,请大侠们指教了....
如:
文本字符串: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...以此类推,直到找完为止...呵,总感觉这样做有点笨,很老土,受思想与水平限制,没想到更高效的方法,请大侠们指教了....
解决方案 »
- JAVA SOUND求助
- 跟简单的代码问题
- javap忽悠了很多人。原来它并不是编译的顺序。
- 请高手们帮帮忙,"玩"一个大家来找茬的游戏!急!谢谢了!
- FileInputStream的Read方法的两次输出问题?
- 请问如何把class文件生成为exe?
- 哪种开发环境速度较快啊?
- ######大家进来拿分吧###############
- JBuilder 如何产生Java Application .exe文件??
- 是不是只要把applet打包成jar文件浏览器就要用到Plug in?
- 想要修改对象集合(已排序)其中一个对象,在vector中存放,修改后仍要放回原位置,你看这样行不行?这样是不是太荒谬了?
- linux-C实现SSLSocket服务端, 可以在客户端端用JSSE实现SSLSocket通讯吗
也可以用正规(上面方法是首选,自己感觉),正规已经有帖子了,我等下给你找。
那就用正则匹配!我晕, 我倒!
这个方法只能在js中用吧,我要在java里使用, 当然非要在js中算好后再传到后台服务器也行...
//表达式说明
// <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));
}
不过正则表达式之前少接触,我要慢慢的去领会了,我想先得到结果,然后再
仔细的研究下,你的代码可能有出入吧,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));//无值
} }
}
代码可直接拷贝使用,各位有空再帮我看下哪里漏了.(由于关于正则这方面的知识,以前没怎么接触,自己也要去补补课了,呵,但还是希望这个结果先出来感觉学起来更有成就感些的,呵,再谢了.)
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呢?
当然应该可以的,只是(.*?)这个怎么写了?一时搞不定....
Pattern p = Pattern.compile("<img.*?src=['\"]/test/upload/image/(.*?)['\"].*?>");
感觉楼上的各位,就此结了...