java中正则表达式的使用(2)——列出百度搜索的前十项
来源:互联网 发布:淘宝卖家取消订单投诉 编辑:程序博客网 时间:2024/05/01 23:51
继续,写了一个小程序来练习网络编程+正则的使用,程序运行界面如下:
编程思路:界面——按钮事件——get提交数据——正则分析返回数据——JTable显示——JTable双击事件(打开后面的地址)。
1.界面(Main类)
import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;public class Main extends JFrame{/** * @param args */private JButton sosuo;private JTextField text;public JTextArea jta;private Table jsp;private JPanel jp1;private JLabel jb1;private JLabel jb2;private JLabel jb3;public String[][] neirong;public Main(){sosuo=new JButton("搜索");text=new JTextField();jsp=new Table();jp1=new JPanel();jb1=new JLabel();jb2=new JLabel();jb3=new JLabel("双击打开连接");jp1.setLayout(new GridLayout(1,4));jp1.add(jb1);jp1.add(text);jp1.add(sosuo);jp1.add(jb2);add(jb3,BorderLayout.SOUTH);add(jp1,BorderLayout.NORTH);add(jsp,BorderLayout.CENTER);setSize(600,400);//窗体居中显示setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);sosuo.addActionListener(new ActionListener(){public void actionPerformed(final ActionEvent arg0){String ssnr=new String();ssnr=text.getText();if(ssnr!=""){Test test=new Test();neirong=test.parseHTML(ssnr);jsp.setneirong(neirong);}}});}public static void main(String[] args) {// TODO Auto-generated method stubnew Main();}}
:
相对比较简单,就不赘述。
2.数据的提交+正则分析返回数据:
import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.URL;import java.net.URLEncoder;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Test {public String getHTML(String key) throws IOException { StringBuilder sb=new StringBuilder(); //要对汉字进行URLEncoder编码 String path="http://www.baidu.com/s?tn=ichuner&lm=-1&word="+URLEncoder.encode(key,"gb2312")+"&rn=100"; URL url=new URL(path); BufferedReader breader=new BufferedReader(new InputStreamReader(url.openStream())); String line=null; while((line=breader.readLine())!=null) { //System.out.println(new String(line.getBytes(),"UTF-8")); sb.append(line); } return sb.toString(); } public String[][] parseHTML(String key) { String page=null; try { page=getHTML(key); } catch(Exception ex) { ex.printStackTrace(); } /*try {page=gettxt();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}*/ //System.out.println(page); String[][] pageContent_list=new String[10][2]; if(page!=null) { //正则表达式 String regx="<div[^>]*\\s[iI][dD]=[\"\']?\\d{1,3}[\"\']?[^>]*>.*?href\\s*=\\s*\"(?<href>[^\"]*)\".*?<em>(?<biaoti>.*?)</a>"; //pattern和matcher是java中使用正则表达式的两个类 //pattern.COMMRNTS 参数代表 忽略所有的空白符,包括回车 Pattern pattern=Pattern.compile(regx,Pattern.COMMENTS ); Matcher matcher=pattern.matcher(page); for(int i=0;i<10;i++) { if(matcher.find()) { //获得table中的数据 String href=new String();try {href = new String(matcher.group("href").getBytes(),"UTF-8");} catch (UnsupportedEncodingException e) {// TODO 自动生成的 catch 块e.printStackTrace();} String biaoti=new String();try {biaoti = new String(matcher.group("biaoti").getBytes(),"UTF-8");} catch (UnsupportedEncodingException e) {// TODO 自动生成的 catch 块e.printStackTrace();} String table_content=matcher.group().toString(); //System.out.println("table_content: "+table_content); pageContent_list[i][0]=biaoti; pageContent_list[i][1]=href; } } } return pageContent_list; }public static void main(String[] args) {Test test=new Test();//test.parseHTML("百度");String[][] str=test.parseHTML("百度");for(int i=0;i<str.length;i++){System.out.println("第"+(i+1)+"条结果:");System.out.println("标题:"+str[i][0]);try {System.out.println("ur"+new String(str[i][1].getBytes(),"UTF-8"));} catch (UnsupportedEncodingException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}}public Test(){}}
说明:pattern和matcher两个类的使用,感觉初学者没必要太深入,了解基础的使用就ok,后面用多了,去看仔细看官方API。
另外Pattern.compile函数:Pattern Pattern.compile(String regex, int flag)
flag的取值范围如下:
Pattern.CANON_EQ,当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a\u030A"会匹配"?"。默认情况下,不考虑"规范相等性(canonical equivalence)"。
Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹 配,只要将UNICODE_CASE与这个标志合起来就行了。
Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(不是指表达式里的"\\s",而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。
Pattern.DOTALL(?s) 在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式'.'不匹配行的结束符。
Pattern.MULTILINE(?m)在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
Pattern.UNICODE_CASE(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。
Pattern.UNIX_LINES(?d) 在这个模式下,只有'\n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。
3.JTable显示结果:
import java.awt.Desktop;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.DefaultTableModel;public class Table extends JScrollPane{DefaultTableModel tmd;JTable jt;public Table(){String[] lieming={"序号","标题","链接"};tmd=new DefaultTableModel(lieming,11);jt=new JTable(tmd);setViewportView(jt);int[] columnWidth={50,400,150};//设置列宽for(int i=0;i<columnWidth.length;i++){jt.getColumnModel().getColumn(i).setPreferredWidth(columnWidth[i]);}//表格不可编辑jt.setEnabled(false);//jt.setFillsViewportHeight(true); jt.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {int clickCount = e.getClickCount();if (clickCount == 2) {int row =((JTable)e.getSource()).rowAtPoint(e.getPoint()); int col=((JTable)e.getSource()).columnAtPoint(e.getPoint()); System.out.println("坐标:"+row+" "+col); String href=(String)(tmd.getValueAt(row, 2)); URI url=null;try {url = new URI(href);} catch (URISyntaxException e2) {// TODO 自动生成的 catch 块e2.printStackTrace();} try {Desktop.getDesktop().browse(url);} catch (IOException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();}}}});}public void setneirong(String[][] neirong){//清空原有表格tmd.setRowCount(0);String[] arr=new String[3];for(int i=0;i<10;i++){arr[0]=String.valueOf(i+1);arr[1]=neirong[i][0];arr[2]=neirong[i][1];//添加新行tmd.addRow(arr);}//更新表格jt.invalidate();}public static void main(String[] args) {// TODO 自动生成的方法存根}}
- java中正则表达式的使用(2)——列出百度搜索的前十项
- java正则表达式的使用-抓取百度搜索的结果
- python里使用正则表达式的前向搜索或后向搜索模式
- python里使用正则表达式的前向搜索否定模式
- 正则表达式(二)——java中使用正则
- java中正则表达式的使用
- Java中正则表达式的使用.
- Java中正则表达式的简单使用
- 主题:Java中正则表达式的使用
- Java中正则表达式的使用
- Java中正则表达式的使用
- Java中正则表达式的使用
- Java中正则表达式的使用
- java中正则表达式的使用
- Java中正则表达式的使用
- Java中正则表达式的使用
- Java中正则表达式的使用
- Java中正则表达式的使用
- 刀片服务器部署VMWare vSphere遇到的问题总结
- 几款好用的比较工具
- 背景建模--内核密度估计法
- linux内核研究(一)
- qt序列化 (二)
- java中正则表达式的使用(2)——列出百度搜索的前十项
- UIImageView的contentMode
- Wet Shark and Odd and Even
- Java中的接口
- iOS开发之遍历Model类的属性并赋值
- iOS AFNetworking 简单使用
- 导航栏透明渐变(iOS)
- jsp页面直接跳转编码方式
- qt序列化 (三)