黑马程序员_91_正则表达式

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

概述

正则表达式就是对字符串进行操作,它比利用String类中的方法操作要更为简单.
正则常见操作就有4种

  1. 匹配–就是对整个字符串进行匹配,判断true或false
  2. 切割–就是把一个字符串切割成多个字符串
  3. 替换–就是把指定内容替换成新字符串
  4. 获取–就是根据指定规则,获取符合规则的字符串

    正则表达式规则
    字符类
    [abc] a、b 或 c(简单类)
    [^abc] 任何字符,除了 a、b 或 c(否定)
    [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

    预定义字符类
    . 任何字符(与行结束符可能匹配也可能不匹配)
    \d 数字:[0-9]
    \D 非数字: [^0-9]
    \s 空白字符:[ \t\n\x0B\f\r]
    \S 非空白字符:[^\s]
    \w 单词字符:[a-zA-Z_0-9]
    \W 非单词字符:[^\w]

    Greedy 数量词
    X? X,一次或一次也没有
    X* X,零次或多次
    X+ X,一次或多次
    X{n} X,恰好 n 次
    X{n,} X,至少 n 次
    X{n,m} X,至少 n 次,但是不超过 m 次

    边界匹配器
    ^ 行的开头
    $ 行的结尾
    \b 单词边界
    \B 非单词边界
    \A 输入的开头
    \G 上一个匹配的结尾
    \Z 输入的结尾,仅用于最后的结束符(如果有的话)
    \z 输入的结尾

练习

示例1

/*
 * 正则表达式。
 *
 * 正则表达式用于操作字符串数据。
 * 通过一些特定的符号来体现的。
 * 所以我们为了掌握正则表达式,必须要学习一些符号。
 *
 * 虽然简化了,但是阅读性差。
 */
public class RegexDemo
{
        public static void main(String[] args){
                String qq = "123456701";
                //checkQQ(qq);

                //正则表达式。
                String regex = "[1-9][0-9]{4,14}";
                boolean b = qq.matches(regex);
                System.out.println(qq + ":" + b);
        }
        /*
         * 需求:定义一个功能对QQ号进行校验。
         * 需求:长度5~15,只能是数字,0不能开头。
         */
         public static void checkQQ(String qq){

                int len = qq.length();

                if(len >= 5 && len <= 15){
                        if(!qq.startsWith("0")){
                                try{
                                        long l = Long.parseLong(qq);

                                        System.out.println(l + ":正确");
                                }catch(NumberFormatException e){
                                        System.out.println(qq + ":含有非法字符");
                                }
                        }else{
                                System.out.println(qq + ":不能0开头");
                        }
                }else{
                        System.out.println(qq + ":长度错误");
                }
         }
}

运行结果图
这里写图片描述

示例2

public class RegexDemo
{
        public static void main(String[] args){

                String str = "aoob";
                String reg = "ao?b";

                boolean b = str.matches(reg);
                System.out.println(str + ":" + b);

                reg = "ao+b";
                b = str.matches(reg);
                System.out.println(str + ":" + b);

                str = "ab";
                reg = "ao+b";
                b = str.matches(reg);
                System.out.println(str + ":" + b);

                str = "ab";
                reg = "ao*b";
                b = str.matches(reg);
                System.out.println(str + ":" + b);

                str = "aooooooob";
                reg = "ao{4,}b";
                b = str.matches(reg);
                System.out.println(str + ":" + b);

                reg = "ao{4,6}b";
                b = str.matches(reg);
                System.out.println(str + ":" + b);
        }
}

运行结果图
黑马程序员_91_正则表达式_第1张图片
示例3
正则表达式四大常见功能演示

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo
{
        public static void main(String[] args){
                functionDemo_1();
                System.out.println("------------------------");
                functionDemo_2();
                System.out.println("------------------------");
                functionDemo_3();
                System.out.println("------------------------");
                functionDemo_4();
                System.out.println("------------------------");
                functionDemo_5();
                System.out.println("------------------------");
                functionDemo_6();
                System.out.println("------------------------");
                functionDemo_7();
        }

        /*
         * 正则表达式对字符串的常见操作
         * 1. 匹配
         *                其实使用的就是String类中的matches方法。
         *
         * 2. 切割
         *                其实使用的就是String类中的split方法。
         * 
         * 3. 替换
         *
         * 4. 获取
         */

         /*
          * 演示匹配
          */
        public static void functionDemo_1(){
                //匹配手机号码是否正确
                String tel = "15800001111";

                String regex = "1[358]\\d{9}";

                boolean b = tel.matches(regex);

                System.out.println(tel + ":" + b);
        }

         /*
          * 演示切割
          */
        public static void functionDemo_2(){
                String str = "zhangsan      xiaoqiang             zhaoliu";

                String[] names = str.split(" +");

                for(String name : names){
                        System.out.println(name);
                }
        }

        public static void functionDemo_3(){
                String str = "zhangsan.xiaoqiang.zhaoliu";

                String[] names = str.split("\\.");

                for(String name : names){
                        System.out.println(name);
                }
        }

        /*
         * 在表达式 ((A)(B(C))) 中,存在四个这样的组: 
         * 1 ((A)(B(C))) 
         * 2 \A 
         * 3 (B(C)) 
         * 4 (C) 
         * 组零始终代表整个表达式。 
         */
        public static void functionDemo_4(){
                String str = "zhangsanttttxiaoqiangmmmmmzhaoliu";

                //(.)表示一组,\\1+表示与第1组相同的出现1次以上
                String[] names = str.split("(.)\\1+");

                for(String name : names){
                        System.out.println(name);
                }
        }

         /*
          * 演示替换
          */
        public static void functionDemo_5(){
                String str = "zhangsanttttxiaoqiangmmmmmzhaoliu";

                //$表示前一个参数的第一组
                str = str.replaceAll("(.)\\1+","$1");

                System.out.println(str);
        }

        public static void functionDemo_6(){
                String str = "15800001111";

                str = str.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$2");

                System.out.println(str);
        }

        /*
          * 演示获取
          * 将正则规则进行对象的封装。
          * Pattern p = Pattern.compile("a*b");
          * 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher。
          * boolean b = m.matches();
          */
        public static void functionDemo_7(){
                String str = "da jia hao,ming tian bu fang jia";

                // \\b表示单词边界
                String regex = "\\b[a-z]{3}\\b";

                //1. 将正则封装成对象
                Pattern p = Pattern.compile(regex);

                //2. 通过正则对象获取匹配器对象
                Matcher m = p.matcher(str);

                //使用Matcher对象的方法对字符串进行操作。
                //既然要获取三个字母组成的单词。
                //查找:find();
                while(m.find()){
                        System.out.println(m.group());//获取匹配的子序列
                        System.out.println(m.start() + ":" + m.end());
                }
        }
}

运行结果图

黑马程序员_91_正则表达式_第2张图片

Pattern类及其练习

Pattern类为正则表达式的编译表示形式。指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
练习1

public class RegexTest
{
        public static void main(String[] args){
                test();
        }

        /*
         * 1. 治疗口吃:我我...我我...我我我我...要要要要...要要要要...学学学学学...学学编编...编编编编..编..编...程程...程程程
         * 2. 对ip地址排序
         * 3. 对邮件地址校验
         */

         /*
          * 1. 治口吃
          */
          public static void test(){
                String str = "我我...我我...我我我我...要要要要...要要要要...学学学学学...学学编编...编编编编..编..编...程程...程程程";

                //1. 将字符串中.去掉,用替换。
                str = str.replaceAll("\\.+","");

                //2. 替换叠词
                str = str.replaceAll("(.)\\1+","$1");
                System.out.println(str);
          }
}

运行结果图

这里写图片描述
练习2

import java.util.TreeSet;
import java.io.PrintStream;

public class RegexTest
{
        public static void main(String[] args){
                test();
        }

        /*
         * ip地址排序。
         * 192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
         */

        public static void test(){
                String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";

                //1. 为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。
                //所以,补零,按照每一位所需最多0进行补充,每一段都加两个0。

                ip_str = ip_str.replaceAll("(\\d+)","00$1");
                System.out.println(ip_str);

                //然后每一段保留数字3位。
                ip_str = ip_str.replaceAll("0*(\\d{3})","$1");
                System.out.println(ip_str);

                //1. 将ip地址切出。
                String[] ips = ip_str.split(" +");

                TreeSet ts = new TreeSet();

                for(String ip : ips){
                        ts.add(ip);
                }

                for(String ip : ts){
                        System.out.println(ip.replaceAll("0*(\\d+)","$1"));
                }
        }
}

运行结果图
黑马程序员_91_正则表达式_第3张图片
练习3

import java.util.TreeSet;
import java.io.PrintStream;

public class RegexTest
{
        public static void main(String[] args){
                test();
        }

        //对邮件地址校验。        
        public static void test(){

                String mail = "[email protected]";

                String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";

                boolean b = mail.matches(regex);

                System.out.println(mail + ":" + b);
        }
}

运行结果图
这里写图片描述
练习4

import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.IOException;

/*
 * 网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。
 * 爬取邮箱地址。
 */
public class RegexTest
{
        public static void main(String[] args) throws IOException {
                List list = getMails();

                for(String mail : list){
                        System.out.println(mail);
                }
        }

        public static List getMails() throws IOException {
                //1. 读取源文件。
                BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));

                //2. 对读取的数据进行规则的匹配。从中获取符合规则的数据。
                String mail_regex = "\\w+@\\w+(\\.\\w+)+";

                List list = new ArrayList();

                Pattern p = Pattern.compile(mail_regex);

                String line = null;

                while((line = bufr.readLine()) != null){
                        Matcher m = p.matcher(line);

                        while(m.find()){
                                list.add(m.group());
                        }
                }

                //3. 将符合规则的数据存储到集合中。
                return list;
        }
}

运行结果图
黑马程序员_91_正则表达式_第4张图片
练习5

import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class RegexTest
{
        public static void main(String[] args) throws IOException {
                List list = getMailsByWeb();

                for(String mail : list){
                        System.out.println(mail);
                }
        }

        public static List getMailsByWeb() throws IOException {

                URL url = new URL("http://www.itheima.com/aboutt/1376.html");

                BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream()));

                String mail_regex = "\\w+@\\w+(\\.\\w+)+";

                List list = new ArrayList();

                Pattern p = Pattern.compile(mail_regex);

                String line = null;

                while((line = bufr.readLine()) != null){
                        Matcher m = p.matcher(line);

                        while(m.find()){
                                list.add(m.group());
                        }
                }

                return list;
        }
}

运行结果图
这里写图片描述

你可能感兴趣的:(黑马Java基础学习笔记)