- 一、动态代理(简)
- 二、正则表达式
- 原义字符
- 元字符:字符类
- 元字符:范围类
- 元字符:预定义类
- 边界字符
- 量词类
- 元字符:分组()
- 元字符:反向引用
- 三、校验手机号、邮箱号
I know, i know
地球另一端有你陪我
一、动态代理(简)
代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
举例:春季回家买票让人代买
动态代理:在程序运行过程中产生的这个对象
而程序运行过程中产生对象其实就是反射
所以,动态代理其实就是通过反射来生成一个代理
// 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___元字符:预定义类
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 ___________________________边界字符
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量词类
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三、校验手机号、邮箱号
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);
}
}



