黑马程序员——正则表达式和网页爬虫

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

< 今日心情 >放掉懒惰,再加上一份坚持

一、正则表达式

作用:用于专门操作字符串
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,这则越长,阅读性越差

二、基本内容

1.字符类

[abc]               a、b或c
[^abc]              任意字符,除了a、b或c
[a-zA-Z]           a到z或者A到Z

2.预定义字符类

.                    任意字符
\d                    数字[0-9]
\D                   非数字[^0-9]
\s                    空白字符
\S                    非空白字符
\w                    单词字符[a-zA-Z_0-9]
\W                   非单词字符

3.边界匹配器

\b                    单词的边界
\B                    非单词的边界

4.数量词

X?                   X,出现0次或1次
X*                    X,出现0次或多次
X+                   X,出现1次或多次
X{n,m}           X,至少出现n次,至多出现m次

三、网页爬虫

1.原理

连接服务器端Socket接收数据,在数据中匹配内容

2.示例

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.regex.*;
class MyWindow
{
	private Frame wMain;
	
	private Panel mUp,mBotom;
	private TextField inputDir;
	private TextArea content;
	private Button btn;

	private Dialog erroyDialog;
	private Label erroyMessage;
	private Button erroyBtn_ok;

	private MenuBar fileMB;
	private Menu fileMenu;
	private MenuItem fmClose;

	private Menu fmOpen;
	private MenuItem[] fmOpenItem;

	private MenuItem save,saveAs;
	public MyWindow()
	{
		init();
	}
	protected void init()
	{
		wMain=new Frame("bigniu");
		wMain.setBounds(300,200,495,400);
		wMain.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));
		inputDir=new TextField(40);
		content=new TextArea(15,60);
		btn=new Button("查询");

		mUp=new Panel(new BorderLayout(10,10));
		mUp.add(inputDir,BorderLayout.CENTER);
		mUp.add(btn,BorderLayout.EAST);

		mBotom=new Panel(new BorderLayout(10,10));
		mBotom.add(content,BorderLayout.CENTER);

		erroyDialog=new Dialog(wMain,"错误",true);
		erroyDialog.setBounds(300,200,200,130);
		erroyDialog.setLayout(new BorderLayout(10,10));
		erroyMessage=new Label();

		Panel p=new Panel(new FlowLayout(FlowLayout.RIGHT,10,10));
		erroyBtn_ok=new Button("确定");
		p.add(erroyBtn_ok);
		erroyDialog.add(erroyMessage,BorderLayout.CENTER);
		erroyDialog.add(p,BorderLayout.SOUTH);
		
		fileMB=new MenuBar();
		fileMenu=new Menu("文件");

		fmClose=new MenuItem("关闭");		
		fmOpen=new Menu("打开");
		fmOpenItem=new MenuItem[5];
		for(int i=0;i<5;i++)
		{
			fmOpenItem[0]=new MenuItem();
			fmOpen.add(fmOpenItem[0]);
		}
		save=new MenuItem("保存");
		saveAs=new MenuItem("另存为");

		fileMenu.add(fmOpen);
		fileMenu.add(save);
		fileMenu.add(saveAs);
		fileMenu.add(fmClose);
		
		fileMB.add(fileMenu);
		wMain.setMenuBar(fileMB);
		
		wMain.add(mUp);
		wMain.add(mBotom);
		addEvent();
		wMain.setVisible(true);
		
	}



	protected void btn_click()
	{
		URL url=null;
		URLConnection uc=null;
		BufferedReader br=null;
		PrintWriter fw=null;
		content.setText("");
		try
		{
			url=new URL(inputDir.getText());
			uc=url.openConnection();
			br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
			fw=new PrintWriter(new FileOutputStream("F:/qq.txt"),true);
			Pattern p=Pattern.compile("[qQ].{0,3}([1-9]\\d{4,14})");
			Matcher m;
			TreeSet
      
      
       
        ts=new TreeSet
       
       
        
        ();
			for(String s=br.readLine();s!=null;s=br.readLine())
			{
				m=p.matcher(s);
				while(m.find())
				{
					ts.add(m.group(1));
					fw.println(m.group(1));
					content.append(m.group(1)+"\r\n");
				}
			}
			m=null;
			content.setText("");
			for(String s:ts)
			{
				content.append(s+"\r\n");
			}
		}
		catch(FileNotFoundException ffe)
		{
			erroyMessage.setText("请确认该文件的有效性:‘F:/qq.txt’");
			erroyDialog.setVisible(true);
		}
		catch (MalformedURLException me)
		{
			erroyMessage.setText("这不是一个有效的网址。");
			erroyDialog.setVisible(true);
		}
		catch(IOException ioe)
		{
			erroyMessage.setText("连接失败!");
			erroyDialog.setVisible(true);
		}
		finally
		{
			if(fw!=null)
			{
				try
				{
					fw.close();
				}
				catch (Exception e)
				{
				}
			}
		}
	}

	protected void addEvent()
	{
		wMain.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		erroyDialog.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e)
			{
				erroyDialog.setVisible(false);
			}
		});
		erroyBtn_ok.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{
				erroyDialog.setVisible(false);
			}
		});
		btn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{
				btn_click();
			}
		});
		inputDir.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e)
			{
				switch(e.getKeyCode())
				{
					case KeyEvent.VK_ESCAPE :
						inputDir.setText(" ");
						break;
					case KeyEvent.VK_ENTER :
						btn_click();
						break;
				}
			}
		});
	}

}

class AwtDemo
{
	public static void main(String[] args)
	{
		new MyWindow();
	}
}


       
       
      
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值