zoukankan      html  css  js  c++  java
  • 黑马程序员——【Java基础】——正则表达式

    ---------- android培训java培训、期待与您交流! ---------- 

    一、概述

      1、 概念:符合一定规则的表达式。

      2、 作用:用于专门操作字符串。

      3、 特点:用一些特定的符号来表示一些代码操作,这样可以简化书写。

      4、 好处:可以简化对字符串的复杂操作。

      5、 弊端:符合定义越多,正则越长,阅读性越差。

    二、常见规则

      1、字符类

        [abc]:表示a、b或 c

        [^abc]:表示任何字符,除了 a、b或 c

        [a-zA-Z]:表示a到 z或 A 到 Z

        [a-d[m-p]]:表示a到 d或 m 到 p([a-dm-p](并集))

        [a-z&&[def]]:d、e或 f(交集)

        [a-z&&[^bc]]:表示a到 z,除了 b和 c:[ad-z](减去)

        [a-z&&[^m-p]]:表示a到 z,而非 m到 p:[a-lq-z](减去)

      2、预定义字符

        . : 任何字符(与行结束符可能匹配也可能不匹配)

        d:数字:[0-9]

        D:非数字: [^0-9]

        s:空白字符:[ x0Bf ]

        S:非空白字符:[^s]

        w:单词字符:[a-zA-Z_0-9]

        W:非单词字符:[^w]

      3、边界匹配符

        ^:行的开头

        $ :行的结尾

        :单词边界

        B:非单词边界

        A:输入的开头

        G:上一个匹配的结尾

        :输入的结尾,仅用于最后的结束符(如果有的话)

        z:输入的结尾

      4Greedy数量词

        X? :X出现一次或一次也没有

        X*:X出现零次或多次

        X+: X出现一次或多次

        X{n}:X恰好 n次

        X{n,}:X至少 n次

        X{n,m}X:至少 n次,但是不超过 m 次

      5、组和捕获

        捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:

        1     ((A)(B(C)))

        2     A

        3     (B(C))

        4     (C)

        组零始终代表整个表达式,在替换中常用$匹配组的内容。

    三、正则表达式常见功能

      正则表达式常见功能,主要有四种:匹配、切割、替换和获取

      1、匹配

        String类中的boolean matches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

      2、切割

        String类中的String[] split(String regex)方法。

      3、替换

        String replaceAll(String regex , String replacement)方法。示例:

        String str = “zhangsantttxiaoqiangmmmzhan”

        str = str.replaceAll(“(.)\” , );

      4、获取

        获取:是将字符串中符合规则的子串取出。

        操作步骤:

         (1)将正则表达式封装成对象。Pattern p = Pattern.compile(regex);

         (2)让正则对象和要操作的字符串相关联。Matcher m = p.matcher(str);

         (3)关联后,获取正则匹配引擎。

         (4)通过引擎对符合规则的子串进行操作,例如查找、取出。m.find()、m.group();

    四、正则表达式应用练习

      练习1:字符串转换

     1 /* 需求:将下列字符串转成:我要学编程
     2 "我我...我..我要...要...要要....学学....学学学......编编编...程...程程...."
     3 
     4 思路:
     5 将已有字符串变成另一个字符串。使用替换功能。
     6 1、可以先将 . 去掉。
     7 2、再将多个重复的内容变成单个内容。
     8 */
     9 class  ReplaceTest{
    10     public static void main(String[] args){
    11         String s = "我我...我..我要...要...要要....学学....学学学......编编编...程...程程....";
    12         System.out.println(s);
    13   
    14         String regex = "\.+";//先将 . 去掉
    15         s = s.replaceAll(regex,"");//去掉 .
    16         System.out.println(s);
    17   
    18         regex = "(.)\1+";//将重复的内容变成单个内容
    19         s = s.replaceAll(regex,"$1");//去重
    20         System.out.println(s);
    21     }
    22 }

      练习2:将ip地址进行地址段顺序的排序。

     1 /* 需求:将ip地址进行地址段顺序的排序。
     2 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301 
     3 
     4 思路:
     5 还按照字符串自然顺序,只要让他们每一段都是3位即可。
     6 1、按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
     7 2、将每一段只保留3位。这样,所有的ip地址都是每一段3位。
     8 */
     9 import java.util.*;
    10 class IPSortTest{
    11     public static void main(String[] args){
    12         String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";
    13         System.out.println(ip);
    14   
    15         String regex = "(\d+)";
    16         ip = ip.replaceAll(regex,"00$1");//保证每段至少都有三位-------------
    17         System.out.println(ip);
    18   
    19         regex = "0*(\d{3})";
    20         ip = ip.replaceAll(regex,"$1");//每段只保留三位
    21         System.out.println(ip);
    22   
    23         regex = " ";
    24         String[] arr = ip.split(regex);//按照空格切
    25         
    26         //定义一个TreeSet集合,利用元素自然排序
    27         TreeSet<String > ts = new TreeSet<String>();
    28         for (String str : arr ){
    29             ts.add(str);//添加
    30         }
    31         regex = "0*(\d)";//把每段前面多余的0替换掉
    32         for (String s : ts){
    33             System.out.println(s.replaceAll(regex,"$1"));//把每段前面多余的0替换掉
    34         }
    35     }
    36 }

      练习3:邮件地址校验

     1 //需求:对邮件地址进行校验。
     2 class CheckMail{
     3     public static void main(String[] args){
     4         String mail = "123a809bc@sina.com.cn";
     5         String regex = "\w+@[a-zA-Z0-9]+(\.[a-zA-Z]+){1,3}";//较为精确
     6         regex = "\w+@\w+(\.\w+)+";//相对不太精确的匹配。
     7         boolean b = mail.matches(regex);
     8         System.out.println(b);
     9     }
    10 }

      练习4:网络爬虫

    /* 网络爬虫
    实际上是一个功能,用于搜集网络上的指定信息
    需求:可用于收集邮箱,qq号等之类的信息。
    */
    import java.net.*;
    import java.util.regex.*;
    import java.io.*;
    class Spider{
        public static void main(String[] args)throws Exception{
            //getFileMail();
            getWebMail();
        }  
        //获取网页中mail
        public static void getWebMail()throws Exception{
            //封装网页地址
            URL url = new URL("http://tieba.baidu.com/p/1390896758");
            //连接服务器
            URLConnection conn = url.openConnection();
            //带缓冲区的网页读取流
            BufferedReader br  =  new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            //定义匹配邮件地址的正则表达式
            String regex = "\w+@\w+(\.\w+)+";
            Pattern p = Pattern.compile(regex);//封装正则表达式
            //读取网页数据
            while ((line = br.readLine())! = null){
                //正则关联数据
                Matcher m = p.matcher(line);
                //寻找匹配邮箱
                while (m.find()){
                    System.out.println(m.group());//输出匹配邮箱
                }
            }
        }
      
        //获取指定文档中的邮件地址。使用获取功能。Pattern Matcher
        public static void getFileMail()throws Exception{
            //将文件封装成对象
            File file = new File("E:\Java Study\Practice\day25\mail.txt");
            //创建带缓冲区的读取流
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line = null;
      
            //定义正则表达式
            String regex = "\w+@[a-zA-Z]+(\.[a-zA-z]+)+";
            //创建Pattern对象,封装正则表达式
            Pattern p = Pattern.compile(regex);
      
            //读取文件中数据
            while ((line = br.readLine())! = null){
                //关流字符串
                Matcher m = p.matcher(line);
                while (m.find())//寻找匹配的字符串{
                    System.out.println(m.group());//输出匹配的字符串
                }
            }
        }
    }

     

    ---------- android培训java培训、期待与您交流! ----------

  • 相关阅读:
    MyDAL
    MyDAL
    MyDAL
    MyDAL
    MyDAL
    MyDAL
    MyDAL
    MyDAL
    MyDAL
    ThinkPad 安装 Ubuntu 18.10 系统 -- 高分屏各项配置与Nvdia独显驱动
  • 原文地址:https://www.cnblogs.com/jianxingjianyuan2014/p/4006756.html
Copyright © 2011-2022 走看看