正则表达式学习

  1. package com.zhc.love;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class TestRegexp {
  5.     /**
  6.      * @param zhc
  7.      * 和正则表达式有关系的类只有三个.java.lang.String. 
  8.      * java.util.regex.pattern 
  9.      * java.util.regex.Matcher
  10.      */
  11.     public static void main(String[] args) {
  12.         // 正则表达式本身也是一个字符串
  13.         //java.lang.String 的方法 boolean matches(String regex)  
  14.         //一个点代表一个字母,是否匹配三个字母
  15.         System.out.println("aaa".matches("..."));
  16.         //替换一个字符串中的数字 /d 代表数字
  17.         p("ad87654aa".replaceAll("//d""-"));
  18.         //匹配三个从a-z的字母,先产生一个规则.储存在p对象中
  19.         Pattern p = Pattern.compile("[a-z]{3}");
  20.         //调用p对象的匹配方法,去跟字符处匹配,结果保留在m对象中
  21.         Matcher m = p.matcher("aaaaa");
  22.         //打印m,看字符串是不是匹配,返回boolean类型
  23.         p(m.matches());
  24.         //初步认识Regex
  25.         //.表示一个字符  ;* 通配符,表示任意个字符 ;+ 表示出现一次或多次;?一次或者一次也没有
  26.         //[]代表一个范围 [0-9]表示0-9的范围
  27.         //{}表示出现的次数 {3} 出现3次
  28.         p("a".matches("."));
  29.         p("aa".matches("aa"));
  30.         p("aaaa".matches("a*"));//a可以出现任意次
  31.         p("aaaa".matches("a+"));
  32.         p("".matches("a*"));
  33.         p("aaaa".matches("a?"));
  34.         p("".matches("a?"));
  35.         p("a".matches("a?"));
  36.         p("214523145234532".matches("//d{3,100}"));
  37.         p("192.168.0.aaa".matches("//d{1,3}//.//d{1,3}//.//d{1,3}//.//d{1,3}"));
  38.         p("192".matches("[0-2][0-9][0-9]"));
  39.         //正则表达式中范围的描述
  40.         p("----------------------------------------");
  41.         p("a".matches("[abc]"));//要匹配abc中的一个
  42.         p("a".matches("[^abc]"));//取除了abc的任意字符
  43.         p("A".matches("[a-zA-Z]"));//取大写或小写的字符
  44.         p("A".matches("[a-z]|[A-Z]"));//a-z
  45.         p("A".matches("[a-z[A-Z]]"));
  46.         p("R".matches("[A-Z&&[RFG]]"));//取交集[A-Z和[RFG]]取交集做匹配准则
  47.         //认识/s 表示空白字符 ;/w 单词字符:[a-zA-Z_0-9] /d  ;数字:[0-9] ;/ 反斜线字符
  48.         p("----------------------------------------");
  49.         p(" /n/r/t".matches("//s{4}"));
  50.         p(" ".matches("//S"));
  51.         p("a_8".matches("//w{3}"));
  52.         p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
  53.         p("//".matches(""));
  54.         //POSIX Style 用POSIX风格来指定规则,POSIX是unix的一种标准
  55.         p("----------------------------------------");
  56.         p("a".matches("//p{Lower}"));//相当于[a-z]
  57.         //边界匹配boundary [^] 意思是取反.^意思是一行的开头
  58.         p("----------------------------------------");
  59.         p("hello sir".matches("^h.*"));
  60.         p("hello sir".matches(".*ir$"));
  61.         p("hello sir".matches("^h[a-z]{1,3}o//b.*"));
  62.         p("hellosir".matches("^h[a-z]{1,3}o//b.*"));
  63.         //空白行的检测
  64.         p("----------------------------------------");
  65.         p(" /n".matches("^[//s&&[^//n]]*//n$"));
  66.         //匹配emali地址的正则表达式
  67.         p("----------------------------------------");
  68.         p("aaa-aaa@aaa.com".matches("[//w.-]+@[//w*]+[.][//w*]+"));
  69.         //matches find lookingAt  matches匹配整个字符串 相当与c语言中的strtok方法
  70.         //每次匹配完一次后,指针停留在匹配的最后一个字符串的位置上,必须reset下
  71.         p("----------------------------------------");
  72.         Pattern p1 = Pattern.compile("//d{3,5}");
  73.         String s1 = "123-34345-234-00";
  74.         Matcher m1 = p1.matcher(s1);
  75.         p(m1.matches());
  76.         p(m1.find());//找一个和整个模式相匹配的子串
  77.         p(m1.find());//找一个和整个模式相匹配的子串
  78.         p(m1.find());//最后匹配-00 ,已经不符合匹配规则
  79.         p("----------------------------------------");
  80.         Pattern p2 = Pattern.compile("//d{3,5}");
  81.         String s2 = "123-34345-234-00";
  82.         Matcher m2 = p2.matcher(s2);
  83.         p(m2.matches());
  84.         m2.reset();//把原来指针指向开头的地方
  85.         p(m2.find());//找一个和整个模式相匹配的子串
  86.         p(m2.find());//找一个和整个模式相匹配的子串
  87.         p(m2.find());//找一个和整个模式相匹配的子串
  88.         p(m2.find());//最后匹配-00 ,已经不符合匹配规则
  89.         p("-----------------------------------------");
  90.         Pattern p3 = Pattern.compile("//d{3,5}");
  91.         String s3 = "123-34345-234-00";
  92.         Matcher m3 = p1.matcher(s3);
  93.         p(m3.lookingAt());//从开头开始匹配.匹配了则显示true
  94.         p(m3.lookingAt());
  95.         p(m3.lookingAt());
  96.         p(m3.lookingAt());
  97.         //Matcher的start()方法end()方法找到匹配字符串的指针的位置
  98.         p("-----------------------------------------");
  99.         Pattern p4 = Pattern.compile("//d{3,5}");
  100.         String s4 = "123-34345-234-00";
  101.         Matcher m4 = p4.matcher(s4);
  102.         p(m4.matches());
  103.         m4.reset();//把原来指针指向开头的地方
  104.         p(m4.find());//找一个和整个模式相匹配的子串 0-3 第0个位置到指针的下一个开始的位置3
  105.         p(m4.start() + "-" + m4.end());
  106.         p(m4.find());//找一个和整个模式相匹配的子串
  107.         p(m4.start() + "-" + m4.end());
  108.         p(m4.find());//找一个和整个模式相匹配的子串
  109.         p(m4.start() + "-" + m4.end());
  110.         p(m4.find());//最后匹配-00 ,已经不符合匹配规则 如果找不到start会报错
  111.         
  112.         //字符串的替换replacement
  113.         p("-----------------------------------------");
  114.         //从指定的字符串找到规则中的字符串.打印出来 group() 找到跟规定字符串的字符串.把他放在一个"数组"里 
  115.         //Pattern p5 = Pattern.compile("java");
  116.         Pattern p5 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//可以加一些修饰.这是忽略大小写
  117.         Matcher m5 = p5.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
  118.         //Matcher m5 = p5.matcher("java java java java java ");
  119.         while(m5.find()){
  120.             p(m5.group());
  121.         }
  122.         p("-----------------------------------------");
  123.         Pattern p6 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//可以加一些修饰.这是忽略大小写
  124.         Matcher m6 = p6.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
  125.         while(m6.find()){
  126.             p(m6.replaceAll("DUANJING"));
  127.         }//把找到的字符串都替换成指定的字符串
  128.         p("-----------------------------------------");
  129.         //当偶数换成java 当奇数换成JAVA ,public Matcher appendReplacement(StringBuffer sb,String replacement)
  130.         //将替换后的字符串保存在buf中,但是指针只指到替换的最后一个位置.得用appendTail(StringBuffer sb) 
  131.         //将字符串末尾添加到buf中
  132.         Pattern p7 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//可以加一些修饰.这是忽略大小写
  133.         Matcher m7 = p7.matcher("aaaa java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
  134.         int i=0;
  135.         StringBuffer buf = new StringBuffer();
  136.         while(m7.find()){
  137.             i++;
  138.             if(i%2 == 0) {
  139.                 m7.appendReplacement(buf, "java");
  140.             } else {
  141.                 m7.appendReplacement(buf, "JAVA");
  142.             }
  143.         }
  144.         //m.appendTail(buf);
  145.         p(buf);
  146.         //正则表达式的分组 ()表示分组 ()的数量代表组的数量 每个组有自己的组号
  147.         //m.group() 整个组 m.group()第一组 (是第几个就是第几组
  148.         p("-----------------------------------------");
  149.         Pattern p8 = Pattern.compile("(//d{3,5})([a-z]{2})");
  150.         String s8 = "123aa-34345bb-234cc-00";
  151.         Matcher m8 = p8.matcher(s8);
  152.         while(m8.find()) {
  153.             p(m8.group(2));//打印第二个分组 都字母的
  154.             }
  155.     }
  156.     //重写System.out.println(o);方法
  157.     public static void p(Object o){
  158.         System.out.println(o);
  159.     }
  160. }
  1. package com.zhc.love;
  2. import java.io.BufferedReader;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8. public class EmailSpider {
  9.     /**
  10.      * @by zhc
  11.      * 从网页中抓取email地址
  12.      */
  13.     public static void main(String[] args) {
  14.         //先把网页读取进来,用BufferReader 封装
  15.         String line;
  16.         BufferedReader br = null;
  17.         try {
  18.             br = new BufferedReader(new FileReader("D://workspace//RegExp//aaa.txt"));
  19.             while((line=br.readLine())!=null){
  20.                 parse(line);
  21.             }
  22.         } catch (FileNotFoundException e) {
  23.             System.out.println("文件没有找到!");
  24.         } catch (IOException e) {
  25.             System.out.println("读取文件错误!");
  26.         }finally{
  27.             if(br != null){
  28.                 try {
  29.                     br.close();
  30.                 } catch (IOException e) {
  31.                     e.printStackTrace();
  32.                 }
  33.             }
  34.         }
  35.     }
  36.     //分析页面的email地址
  37.     private static void parse(String line) {
  38.         //首先定义一个正则表达式
  39.         Pattern p = Pattern.compile("[//w.-]+@[//w*]+[.][//w*]+");
  40.         //用规则去匹配读取的一行
  41.         Matcher m  = p.matcher(line);
  42.         //当有结果的时候把结果打印出来
  43.         while(m.find()){
  44.             System.out.println(m.group());
  45.         }
  46.         
  47.         
  48.     }
  49. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值