文章目录

  • 一、动态代理(简)
  • 二、正则表达式
  • 原义字符
  • 元字符:字符类
  • 元字符:范围类
  • 元字符:预定义类
  • 边界字符
  • 量词类
  • 元字符:分组()
  • 元字符:反向引用
  • 三、校验手机号、邮箱号

一、动态代理(简)

代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
  举例:春季回家买票让人代买

  动态代理:在程序运行过程中产生的这个对象
    而程序运行过程中产生对象其实就是反射
    所以,动态代理其实就是通过反射来生成一个代理
//	Goods 接口,增删改查
public interface Goods {

    public abstract void add();
    public abstract void delete();
    public abstract void update();
    public abstract void select();
}
//	Goods 接口实现类
public class GoodsImp implements Goods {
    @Override
    public void add() {
        System.out.println("增加用户数据");
    }
    @Override
    public void delete() {
        System.out.println("删除用户数据");
    }
    @Override
    public void update() {
        System.out.println("更新用户数据");
    }
    @Override
    public void select() {
        System.out.println("查询用户数据");
    }
}
public class MyInvocation implements InvocationHandler {

    private Object proxy;

    public MyInvocation(Object obj){
        this.proxy = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method
                        , Object[] args) throws Throwable {

        System.out.println("权限校验");
        //	反射调用方法
        Object result = method.invoke(this.proxy, args);
        System.out.println("日志记录");

        return result;
    }
}
// 主程序
public class DynamicAgent {

    public static void main(String[] args) {

        GoodsImp good = new GoodsImp();

        //动态代理
        //我们需要先创建一个动态代理对象
        //public static Object newProxyInstance(ClassLoader loader,
        //                                      类<?>[] interfaces,
        //                                      InvocationHandler h)
        //throws IllegalArgumentException返回指定接口的代理类的实例,
        //该接口将方法调用分派给指定的调用处理程序
        Object o = Proxy.newProxyInstance(good.getClass().getClassLoader()
                                        , good.getClass().getInterfaces()
                                        , new MyInvocation(good));

        Goods g = (Goods) o;

        System.out.println(o.getClass());
        System.out.println(g.getClass());

        g.add();
        System.out.println("-----------------");
        g.delete();
        System.out.println("-----------------");
        g.select();
        System.out.println("-----------------");
        g.update();
    }
}

运行结果:

class com.sun.proxy.$Proxy0
		 class com.sun.proxy.$Proxy0
         权限校验
         增加用户数据
         日志记录
         -----------------
         权限校验
         删除用户数据
         日志记录
         ...



二、正则表达式

原义字符

/*
        原义字符
 */
public class Regular2 {
    public static void main(String[] args) {

        String regex = "a";
        String s = "abajbgakjabsfgababccaaaa";
        System.out.println(s.replaceAll(regex,"_"));
    }
}

输出结果

_b_jbg_kj_bsfg_b_bcc____

元字符:字符类

/*
        元字符
            字符类

 */
public class Regular3 {
    public static void main(String[] args) {
        //  定义规则
        //  只要字符串中出现了abc中的任意一个都会匹配到并替换
        //  []将字符进行归类,可以出现括号中的任意一个字符进行匹配
        String regex = "[abc]";
        //  反选
        String regex2 = "[^abc]";
        String s = "abajbgakjabsfgababccaaaa";
        System.out.println(s);
        System.out.println(s.replaceAll(regex,"_"));
        System.out.println(s.replaceAll(regex2,"_"));
    }
}

输出结果

abajbgakjabsfgababccaaaa
	___j_g_kj__sfg__________
	aba_b_a__ab___ababccaaaa

元字符:范围类

/*
        元字符
            范围类

 */
public class Regular4 {

    public static void main(String[] args) {

        // a 到 z 小写
        String regex = "[a-z]";
        // a 到 z 大、小写
        String regex2 = "[A-z]";
        // a 到 z 小写 和 4
        String regex3 = "[a-z4]";

        String s = "ASisf3446ajskdZfg345aht";

        System.out.println(s);
        System.out.println(s.replaceAll(regex,"_"));
        System.out.println(s.replaceAll(regex2,"_"));
        System.out.println(s.replaceAll(regex3,"_"));
    }
}

输出结果

ASisf3446ajskdZfg345aht
	AS___3446_____Z__345___
	_____3446________345___
	AS___3__6_____Z__3_5___

元字符:预定义类

/*
     元字符:
        预定义类:
            \d == [0-9] 数字
            \D == [^0-9] 非数字
            空白字符:[\t\n\x0B\f\r] == \s
            [^ \t\n\x0B\f\r] == \S
            \w == [a-zA-Z0-9]
            \W == [^a-zA-Z0-9]
            . 任何字符(与行结束符可能匹配也可能不匹配)
 */
public class Regular5 {

    public static void main(String[] args) {

        String regex = null;
        String s = "abc12323 124ad aqw&;1234.AB";

        regex = "\\d";  //  数字
        System.out.println(s.replaceAll(regex,"_"));
        regex = "\\D";  //  数字之外
        System.out.println(s.replaceAll(regex,"_"));

        regex = "\\s";  //  空白字符  空格
        System.out.println(s.replaceAll(regex,"_"));
        regex = "\\S";  //  除空白字符外
        System.out.println(s.replaceAll(regex,"_"));

        regex = "\\w";  //  大小写字母及数字
        System.out.println(s.replaceAll(regex,"_"));
        regex = "\\W";  //  大小写字母及数字
        System.out.println(s.replaceAll(regex,"_"));

        //如果仅仅是想要匹配.这个字符
        //需要用\进行转义  "\\."
        regex = ".";
        System.out.println(s.replaceAll(regex,"_"));
    }
}

输出结果

abc12323 124ad aqw&;1234.AB
	abc_____ ___ad aqw&;____.AB
	___12323_124________1234___
	abc12323_124ad_aqw&;1234.AB
	________ _____ ____________
	________ _____ ___&;____.__
	abc12323_124ad_aqw__1234_AB
	___________________________

边界字符

/*
        边界字符:
            ^:以xxx开头
            $:以xxx结尾
            \b:单词边界
            \B:非单词边界
 */
public class Regular6 {

    public static void main(String[] args) {

        //这里没有中括号,^代表以什么开头
        String regex = "^abc";
        //定义要被匹配的字符串
        String s = "abc12323 124ad aqw&;1234.AB";
        System.out.println(s.replaceAll(regex,"_"));

        regex = "AB$"; //表示以AB结尾
        System.out.println(s.replaceAll(regex,"_"));

        //  字符,数字,连在一起时会公用下划线分开
        s = "Hello World666 1 2 3  &1;0 0 a b s f";
        s = "1&1";
        regex = "\\b"; //匹配单词的两边
        System.out.println(s.replaceAll(regex,"_"));

        regex = "\\B"; //匹配单词之间
        System.out.println(s.replaceAll(regex,"_"));
    }
}

输出结果

_12323 124ad aqw&;1234.AB
abc12323 124ad aqw&;1234._
_1_&_1_
1&1

量词类

/*
        量词类:
            ?:出现0次或者1次
            +:出现1次或者多次
            *:出现任意次
            {n}:出现正好n次
            {n,m}:出现n-m次
            {n,}出现至少n次
 */
public class Regular7 {

    public static void main(String[] args) {

        // 只看@出现的次数
        String regex = "abc@?";
        String s = "abcdfjabc@@1babc@";
        System.out.println(s.replaceAll(regex,"_"));

        //定义一个规则
        regex = "^a?"; //匹配以a开头,只匹配0次或者1次
        s = "aaaaaabcdefg";
        System.out.println(s.replaceAll(regex,"_"));

        regex = "^a+"; //匹配以a开头,匹配1次或者多次为一组,进行替换
        System.out.println(s.replaceAll(regex,"_"));

        regex = "^a*"; //匹配以a开头,匹配任意次为一组,进行替换
        System.out.println(s.replaceAll(regex,"_"));

        regex = "^a{3}"; //匹配以a开头,匹配3个为一组,进行替换
        System.out.println(s.replaceAll(regex,"_"));

        regex = "^a{7,10}"; //匹配以a开头,匹配7到10个为一组,进行替换
        System.out.println(s.replaceAll(regex,"_"));

        regex = "^a{3,}"; //匹配以a开头,匹配3个以上为一组,进行替换
        System.out.println(s.replaceAll(regex,"_"));

    }
}

输出结果

abcdfjabc@@1babc@
	_dfj_@1b_
	_aaaaabcdefg
	_bcdefg
	_bcdefg
	_aaabcdefg
	aaaaaabcdefg
	_bcdefg

元字符:分组()

/*
            元字符:
                分组:
                    ()
 */
public class Regular8 {

    public static void main(String[] args) {
        //分组
        //定义规则
        String regex = "ABC{3,}"; //匹配AB以及包含3个以上的C为一组
        String s = "abcccccABCCC12AabcABCxiaohuaCCCCCabcabcabc123";
        System.out.println(s.replaceAll(regex,"_"));

        regex = "(abc){3,}"; //匹配abc为一组出现了3次以上进行替换
        System.out.println(s.replaceAll(regex,"_"));

        regex = "ABC(123|abc|xiaohua){1,}";
        //匹配ABC为一组一组后出现上述任意内容的进行替换
        System.out.println(s.replaceAll(regex,"_"));
    }
}

输出结果

abcccccABCCC12AabcABCxiaohuaCCCCCabcabcabc123
	abccccc_12AabcABCxiaohuaCCCCCabcabcabc123
	abcccccABCCC12AabcABCxiaohuaCCCCC_123
	abcccccABCCC12Aabc_CCCCCabcabcabc123

元字符:反向引用

/*
        反向引用:
            $
 */
public class Regular9 {

    public static void main(String[] args) {
        //2021-10-28 --> 10/28/2021
        //定义规则
        String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
        String s = "2021-10-28";
        System.out.println(s.replaceAll(regex,"$2/$3/$1"));

        //我现在不想要生成分组编号,怎么办呢? 可以通过?:实现
        regex = "(\\d{4})-(?:\\d{2})-(\\d{2})";
        System.out.println(s.replaceAll(regex,"$2/$2/$1"));
    }
}

输出结果

10/28/2021
	28/28/2021

三、校验手机号、邮箱号

/*
        验证手机号码:
            1、手机号码都是11位,并且都是以1开头
            2、其余都是由数字组成

        验证邮箱是否符合:
            1、由数字字母@数字或者字母.com组成
 */
public class test1 {

    public static void main(String[] args) {
        //Test1
        //定义规则
        String regex = "^1\\d{10}";
        String phoneNum = "17353142512";
        boolean matches = phoneNum.matches(regex);
        System.out.println(matches);

        //Test2
        //定义规则
        String regex2 = "\\w+@\\w+\\.com";
        String emailNum = "116587fdv2335@qdfsq.com";
        boolean matches1 = emailNum.matches(regex2);
        System.out.println(matches1);
    }
}