A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-6-22 14:12  /  1220 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田建 于 2012-6-24 07:47 编辑
  1. //这是写完网络爬虫,打算改变一下,将爬到的东西存到文件,存的时候打算做一次判断,已存在的文件即更名后存储,在更名时遇到一个问题,再就是转义的时候为什么要是两个\\一直有点想不明白!
  2. import java.net.*;
  3. import java.io.*;
  4. import java.util.regex.*;
  5. class RegexTest_2
  6. {
  7.         public static void main(String[] args)throws Exception
  8.         {
  9.                 getMails();
  10.         }
  11.         public static void getMails()throws Exception
  12.         {
  13.                 int count=0;
  14.                 URL url=new URL("http://www.9u8u.com/yxzt/25684_2.html");
  15.                 URLConnection conn=url.openConnection();
  16.                 BufferedReader bufr=new BufferedReader(new InputStreamReader(conn.getInputStream()));
  17.                 File file=new File("mail.txt");
  18.                 while(file.exists()&&file.isFile())//用于判断文件是否已经存在,若存在,便更名
  19.                 {
  20.                         file.renameTo(new File("mail("+(count++)+")"+"\\."+"txt"));//这是我犯的一个错误,后来经过测试,把\\去掉就能解决,但我不太理解为什么加上\\之后编译没问题,但运行会一直保持等待,请高手解答!
  21.                 }
  22.                 BufferedWriter bufw=new BufferedWriter(new FileWriter(file));
  23.                 String line=null;
  24.                 String mailreg="[a-zA-Z0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z0-9]+)+";
  25.                 Pattern p=Pattern.compile(mailreg);
  26.                 while((line=bufr.readLine())!=null)
  27.                 {
  28.                         Matcher m=p.matcher(line);
  29.                         while(m.find())
  30.                         {
  31.                                 bufw.write(m.group());
  32.                                 bufw.flush();
  33.                                 bufw.newLine();
  34.                         }
  35.                         
  36.                 }
  37.         }
  38. }
复制代码

3 个回复

倒序浏览
第一个问题中“.”仅仅是一个字符吧,和正则没有关系。我认为也可以改写成+".txt"。至于为啥会等待,俺也不明白。

至于正则中"."表示任何字符,例如\d表示0-9的数,如果只写"\d"的话,运行时会当成一个转义字符,所以要先用一个"\"表示这里接受的一个字符,然后这个字符是:\d,  加在一起就是 "\\d"
  我感觉这有点可以记住::只要在正则中,"\"肯定要成对的出现 。  记住这句话就好了。
回复 使用道具 举报
这个问题贴出来之后,我又反复的用eclipse测试了,发现之所以一直等待的原因是一直在重复的执行while循环,我想可能原因如下:
因为命名规则里不能有\符号,在命名的时候本与正则无关,转过之后命名不成功,因而会重复执行此段代码,形成死循环,不知是否正确!
回复 使用道具 举报
.在正则表达式表示任意一个字符 \.表示转义字符,表示一个. 在java中\有特殊含义,所以用\\.表示。去掉\\就表示任意字符,可以通过
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马