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

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

正则表达式:

正则表达式是java中比较重要的一个小知识点。所谓正则表达式就是符合一定规则的表达式。他是专门用于操作字符串的,它是一种简化书写格式。所有的简化形式都有利有

弊,正则表达式也不例外,虽然他简化了书写,但是它的阅读性极差,虽然用起来很舒服,但是看代码的人会很头痛。

    下面可以通过一个小例子简单的了解一下正则表达式:

import java.util.regex.*;
public class ShiLi 
{
  public static void main(String[] args) 
      {
          p("abc".matches("..."));                    //matches()判断字符串是否匹配某个表达式,"."表示任何一个字符
          p("a2389a".replaceAll("\\d", "*"));        //将字符串"a2389a"中的数字用*替换,\d 表示“0--9”数字
          Pattern p = Pattern.compile("[a-z]{3}");   //将任何是a--z的字符串长度为3的字符串进行编译,这样可以加快匹配速度
          Matcher m = p.matcher("abc");              //进行匹配,并将匹配结果放在Matcher对象中
          p(m.matches());
           p("abc".matches("[a-z]{3}"));               //上面的三行代码可以用下面一行代码代替
      }
     public static void p(Object o)
  {
        System.out.println(o);
    }
} 


 通过上面的例子可以明白正则表达式的好处,书写简单。在上述例子中为了简化书写 用了正则表达式中的某些部分代替了常规部分,简化了书写。同时更能够体现出正则表达式的便利。

 以下为正则表达式中的特殊字符: 

 \\ 反斜杠 (在正则表达式中"\\"都是成对出现的因为单一的"\"在正则表达式中就是一个特殊符文应该在前面再加一个"\"进行转译 )

 \t 间隔 

 \n 换行  

 \r 回车 

 \d 数字等价于[0-9] 

  \D 非数字等价于[^0-9] 

  \s 空白符号 

  \S 非空白符号 

  \w 单独字符 [a-zA-Z_0-9] 

  \W 非单独字符 [^a-zA-Z_0-9] 

  \f 换页符 

  \e Escape 

  \b 一个单词的边界 

  \B 一个非单词的边界 

  \G 前一个匹配的结束 

   ^为限制开头 ^java 条件限制为以Java为开头字符 

  $为限制结尾 java$ 条件限制为以java为结尾字符 

  .为限制一个任意字符 java.. 条件限制为java后除换行外任意两个字符加入特定限制条件 

  [a-z] 条件限制在小写a to z范围中一个字符 

  [A-Z] 条件限制在大写A to Z范围中一个字符 

  [a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符 

  [0-9] 条件限制在小写0 to 9范围中一个字符 

  [0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符 

  [0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)

  []中加入^后加再次限制条件 

  [^a-z] 条件限制在非小写a to z范围中一个字符 

  [^A-Z] 条件限制在非大写A to Z范围中一个字符 

  [^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符 

  [^0-9] 条件限制在非小写0 to 9范围中一个字符 

  [^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符 

  [^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集) 

 在限制条件为特定字符出现0次以上时,可以使用「*」 

J* 0个以上J 

 .* 0个以上任意字符 

J.*D J与D之间0个以上任意字符 


在限制条件为特定字符出现1次以上时,可以使用「+」 

J+ 1个以上J 

+ 1个以上任意字符 

J.+D J与D之间1个以上任意字符 

 在限制条件为特定字符出现有0或1次以上时,可以使用「?」 

JA? J或者JA 

出现限制为连续出现指定次数字符「{a}」 

J{2} JJ 
J{3} JJJ 

文字a个以上,并且「{a,}」 

J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J并存) 

文字a个以上,b个以下「{a,b}」 

J{3,5} JJJ或JJJJ或JJJJJ 

 两者取一「|」 

J|A J或A 

Java|Hello Java或Hello 
  

 在java中,正则表达式的主要应用为:字符串的替换,字符串的切分等,同时在该部分学习的时候还引入了网络爬虫的小知识点。

所谓的网页爬虫也被称之为蜘蛛。它是一段小序,他是去爬互联网上的指定信息,如:小广告。在做小广告的时候通过发(垃圾)邮件的形式制作。早期为了得到邮箱用的是随机方式或者顺序方式产生一批邮箱,然后将告页面发送过去(这种方式效率比较低下,因为自己产生的一批邮箱不一定都存在),后来通过网络获取已经存在的邮箱,如:对论坛进行读取对其中符合邮箱的信息进行筛选。网页爬虫的应用是十分广泛的,它已经应用在了网络的各个方面,我们可以通过下面一个例子来了解一下网页爬虫。


import java.io.*;
import java.util.regex.*;
import java.net.*;


class  MailTest
{
    public static void main(String[] args) throws Exception
     {
        getMailAddr();
     }


    public static void getMailAddr()throws Exception
     {
        URL url=new URL("http://bbs.itheima.com/forum.php");
        URLConnection con=url.openConnection();
        BufferedReader bufIn=new BufferedReader(new InputStreamReader(con.getInputStream()));
        BufferedWriter bufw=new BufferedWriter(new FileWriter(new File("e://mailaddress.txt")));
        String str=null;
        String regex="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        Pattern p=Pattern.compile(regex);
        while((str=bufIn.readLine())!=null)
          {
              Matcher m=p.matcher(str);
              while(m.find())
               {
                  String ss=m.group();
                  bufw.write(ss,0,ss.length());
                  bufw.newLine();
                  bufw.flush();
               }
           }
      }
}


你可能感兴趣的:(黑马程序员-----正则表达式和网页爬虫)