用Java抓取网页内容筛选邮箱的程序,运行无结果(没有报错)

问题出在哪里?可能的问题已经在注释中标出
代码如下

 package test;
import java.io.*;
import java.net.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class email {
    public static void main(String[] args) {
        String regex="[a-zA-Z_0-9]+@(\\.[a-zA-Z_0-9]{2,3})+";
        String s="";
        String line=null;
        try{
        URL url=new URL("http://tieba.baidu.com/p/4232750852");
        HttpURLConnection uc=(HttpURLConnection)url.openConnection();
        BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
        PrintWriter pw=new PrintWriter(new FileWriter("d:\\data.txt"),true);
        while((line=br.readLine())!=null){
            s=s+line;//如果s用StringBuilder或者StringBuffer代替(s=null)则抛出  NullPointerException
        }
        Pattern p=Pattern.compile(regex);
        Matcher m=p.matcher(s);
        while(m.find()){
            pw.println(m.group());
        }
        pw.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

 package com.zzk.ceshi;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetMail {

    public static void main(String[] args) {
         String regex="\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,}\\b";
//          String s="";
            StringBuilder s = new StringBuilder("");
            String line=null;
            try{
            URL url=new URL("http://tieba.baidu.com/p/4232750852");
            HttpURLConnection uc=(HttpURLConnection)url.openConnection();
            BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
            PrintWriter pw=new PrintWriter(new FileWriter("d:\\data.txt"),true);
            while((line=br.readLine())!=null){
                //s=s+line;//如果s用StringBuilder或者StringBuffer代替(s=null)则抛出  NullPointerException
                s.append(line);
            }
            Pattern p=Pattern.compile(regex);
            Matcher m=p.matcher(s);
            while(m.find()){
                pw.println(m.group());
            }
            pw.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }


}


图片说明

```package com.zzk.ceshi;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetMail {

public static void main(String[] args) {
     String regex="\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,}\\b";

// String s="";
StringBuilder s = new StringBuilder("");
String line=null;
try{
URL url=new URL("http://tieba.baidu.com/p/4232750852");
HttpURLConnection uc=(HttpURLConnection)url.openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
PrintWriter pw=new PrintWriter(new FileWriter("d:\data.txt"),true);
while((line=br.readLine())!=null){
//s=s+line;//如果s用StringBuilder或者StringBuffer代替(s=null)则抛出 NullPointerException
s.append(line);
}
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s);
while(m.find()){
pw.println(m.group());
}
pw.close();
}catch(Exception e){
e.printStackTrace();
}
}

}

换成StringBuilder怎么会有问题呢?
![图片说明](https://img-ask.csdn.net/upload/201702/10/1486691058_638309.png)

首先,原因很简单:你的正则错误了,另外,用StringBuffer没有问题,只是你用的不对。修正代码如下:

 public static void main(String[] args) {
        String regex="\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
        String line=null;
        try{
        URL url=new URL("http://tieba.baidu.com/p/4232750852");
        HttpURLConnection uc=(HttpURLConnection)url.openConnection();
        BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
        PrintWriter pw=new PrintWriter(new FileWriter("d:\\data.txt"),true);
        StringBuffer buffer = new StringBuffer();
        while((line=br.readLine())!=null){
            buffer.append(line);
        }

        String s = buffer.toString();
        Pattern p=Pattern.compile(regex);
        Matcher m=p.matcher(s);
        while(m.find()){
            pw.println(m.group());
        }
        pw.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

运行看看,data.txt里面就有邮箱信息啦。

public class Test {
public static void main(String[] args) {
// String regex = "[a-zA-Z_0-9]+@(\.[a-zA-Z_0-9]{2,3})+";
String regex ="[a-zA-Z0-9]{5,13}+@+[a-zA-Z0-9]{2,5}";
StringBuffer sb=new StringBuffer();
String path="d:/data.txt";
String line = null;
try {
URL url = new URL("http://tieba.baidu.com/p/4232750852");
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
File file=new File(path);
if(!(file.exists())){
file.createNewFile();
}
PrintWriter pw = new PrintWriter(new FileWriter(path),true);
while ((line = br.readLine()) != null) {
sb.append(line+"\n");// 如果s用StringBuilder或者StringBuffer代替(s=null)则抛出
// NullPointerException
}
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(sb);
while (m.find()) {
pw.println(m.group());
}
pw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}