看看这个哪里出错了。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.regex.*;
import java.io.*;
import java.net.URL;
import java.sql.*;
class DataStructure2{
public String newTitle;
public String newUrl;
}class GroupMethod2{                                                   //正则提取方法
String newsTitle;
String newsUrl;
public void regularGroup(String pattern,String matcher){
Pattern p=Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(matcher);
while(m.find()){
newsTitle+=m.group(1)+"\n";
newsUrl+=m.group(2)+"\n";
}

}

}
class MySql2{
String username="   ";
String password="   ";
String url="   ";
String driver="com.mysql.jdbc.Driver";
String newsSQl;

public void insert(String insertSQL){                       //数据库插入方法
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password);
Statement stmt=con.createStatement();         
stmt.executeUpdate(insertSQL);         //插入数据
stmt.close();
con.close();
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}

public void shownews(){                                     //数据库显示方法
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password); Statement stmt=con.createStatement();
ResultSet rs= stmt.executeQuery("select * from people");//显示当前数据库所有的内容。
while(rs.next()){
newsSQl+=rs.getString("id")+"\t"+rs.getString("Title")+"\t"+rs.getString("Url")+"\n";
}
rs.close();
stmt.close();
con.close();
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}


}public class TestCatchWeb2 extends JFrame{
MySql2 ms=new MySql2();
JButton 
b1=new JButton("确定"),
b2=new JButton("导入到数据库"),
b3=new JButton("查看数据库");
JTextField
t1=new JTextField(30);
TextArea
t2=new TextArea(20,80);
JLabel
l1=new JLabel("您所查找的网页信息"),
l2=new JLabel("输入您要查找的网页");
String strUrl="http://news.sina.com.cn";
String title;
String urls;
int number;
TestCatchWeb2(){                                            //构造方法,画面板
setTitle("网页抓取");
JPanel p=new JPanel();
t1.setText(strUrl);
b1.addActionListener(new B1());
b2.addActionListener(new B2());
b3.addActionListener(new B3());
t2.setEditable(false);
//t2.setLineWrap(true);
p.setLayout(new FlowLayout());
p.add(t2);p.add(l1);
p.add(t1);p.add(l2);
p.add(b1);
p.add(b2);
p.add(b3);
add(p);

}
static class WL extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
class B1 implements ActionListener{                    //确定按钮的实现

public void actionPerformed(ActionEvent e){
catches();
t2.append("标题是:"+"\n"+title+"\n");
t2.append("url地址是:"+"\n"+urls+"\n");
t2.append("共收集到"+number+"条信息");
}
}
 
class B2 implements ActionListener{                     //导入数据库按钮的实现
public void actionPerformed(ActionEvent e){

}
}

class B3 implements ActionListener{                    //数据库内容显示按钮的实现
public void actionPerformed(ActionEvent e){

}
}

public void catches(){                                  //网页提取部分
strUrl=t1.getText();
BufferedReader br;

try{
URL url=new URL(strUrl);
InputStreamReader isr=new InputStreamReader(url.openStream());
br=new BufferedReader(isr);
String strRead="";
String regularCatch="<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>";
GroupMethod2 gMethod=new GroupMethod2();
int m=0;
while((strRead=br.readLine())!=null){
gMethod.regularGroup(regularCatch,strRead);
if(!gMethod.newsTitle.equals("")){
title+="标题"+m+gMethod.newsTitle+"\n";

}
else if(!gMethod.newsUrl.equals("")){
urls+="URL地址"+m+gMethod.newsUrl+"\n";

}
}
            br.close();
            number=m;


}
catch(IOException e){
e.printStackTrace();
}
} /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
TestCatchWeb news=new TestCatchWeb();
news.addWindowListener(new WL());
news.setSize(640,420);
news.setVisible(true);
}}
这个是有界面的。标红的地方是正则提取部分。对于这一行网页源代码。我在这个程序中只能提取前面半部分

解决方案 »

  1.   

    但是我在没有界面的情况下用同样的正则却能提取出整个的内容。import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class CatchWord {
            
     public static void main(String[] args) {
           
            Pattern p = Pattern
                    .compile("<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>");
            String s = "<p data-client='important audit'>[<a href='http://news.sina.com.cn/c/2013-08-26/122228049554.shtml' target='_blank'>称王谷二人如胶似漆</a> <a href='http://news.sina.com.cn/c/2013-08-26/153528050748.shtml' target='_blank'>薄熙来最后陈述:我有大过对不起党和群众</a>]</p>";
            Matcher m = p.matcher(s);
            String newsTitle="";
            while (m.find()) {
                System.out.println("打印出url链接:" + m.group(1));
                System.out.println("打印出标题:" + m.group(2));
                System.out.println();
                newsTitle+=m.group(2)+"\n";
                String newsUrl=m.group(1);
                System.out.println("URL是:"+newsUrl+"\n");
                
            }
            System.out.println("所有标题是:"+newsTitle);
                     System.out.println("group方法捕获的数据个数:" + m.groupCount() + "个");
        }}
    这是什么原因呢。不知道我哪里有错误。大神们给指点下。
      

  2.   

    改成
                newsTitle+=m.group(1)+" ";
                newsUrl+=m.group(2)+" ";
    试试
      

  3.   

    我没看懂意思,那个图太小。
    如果是换行原因的话,
    正则改成
     String regularCatch="(?s)<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>";
    就行了。
      

  4.   


    这样不行的。我觉得应该不是这里的问题吧。我这里是个while循环。就算用了\n应该也不会影响他的读取啊。
      

  5.   

    大神,不知道你哪张图看不清啊动动您的小手,右键另存为。然后就可以放大了。我按照你的进行修改了还是不行。我再说一遍我的意思吧。就是我想截取:
    <p data-client="important audit">[<a href="http://news.sina.com.cn/c/2013-08-27/023928053793.shtml" target="_blank">案件侦查阶段近百人被调查</a> <a href="http://news.sina.com.cn/c/2013-08-26/122228049554.shtml" target="_blank">薄熙来:王立军暗恋谷开来不能自拔</a>]</p>这个网页中的标题和url。但是在我的程序里面只能截取案件侦查阶段近百人被调查
    而后面的薄熙来:王立军暗恋谷开来不能自拔则被忽略了、这是什么原因。
      

  6.   

    您是想说,把
    改成
                newsTitle+=m.group(1)+" ";
                newsUrl+=m.group(2)+" ";
    这样么?这样还是不行。
      

  7.   

    Matcher m = Pattern.compile("(?s)<a href=\"(.*?)\" target=\"_blank\">(.*?)</a>").matcher(str);
    while(m.find()){
    System.out.println(m.group(1)+","+m.group(2));
    }
    结果:
    http://news.sina.com.cn/c/2013-08-27/023928053793.shtml,案件侦查阶段近百人被调查
    http://news.sina.com.cn/c/2013-08-26/122228049554.shtml,薄熙来:王立军暗恋谷开来不能自拔
    有问题再追问。。
      

  8.   

    Matcher m = Pattern.compile("(?s)<a href=\"(.*?)\" target=\"_blank\">(.*?)</a>").matcher(str);
    while(m.find()){
    System.out.println(m.group(1)+","+m.group(2));
    }
    结果:
    http://news.sina.com.cn/c/2013-08-27/023928053793.shtml,案件侦查阶段近百人被调查
    http://news.sina.com.cn/c/2013-08-26/122228049554.shtml,薄熙来:王立军暗恋谷开来不能自拔
    有问题再追问。。
    恩,我知道这样可以,就像我在二楼里面写的那个也可以单独地读取这一行。但是就是我在那个有界面的程序中只能输出前面半句(一楼的程序中)。要不再仔细帮我研究下?你也可以看看我在二楼贴出来的那个程序。
      

  9.   

    我问你,有界面和无界面的时候输入的内容一样么?
    首先你得先把被检测的内容答出来看看是否一样,如果正则不变,一个能提取一个不能提取,那么只能是输入内容的问题。就像楼上面说的,加了忽略换行表示(?s)了么?
    第二,"."代表的是什么?我看你正则中用了很多.,乱用.真的不合适。
    最后,把要截取的字段(包括空格换行等等。。)和截取后你想要的效果发上来就行了。。
    方便加个qq么。或许是我说的不明白,能否加个,我和你再仔细说说。我的是912247433
      

  10.   

    大神你还在么。。我是想做一个网页提取的东西。我二楼的只是做一个例子。在新浪新闻首页中,选取了一行网页源代码来当作范例的。而在一楼里面是把整个网页拿来读取的。不知道这个有没有影响、还有,我把\"用了.来替代。以后会注意的。还有,我在代码中已经加入了(?s)。。
    一行和整个网页(多行)只要加了(?s)就可以忽略换行的影响,
    你可以直接把网页源码拷贝到txt文件中然后读出来做实验。。