一、正则表达式
含义:用来描述或者匹配一系列符合某个语句规则的字符串
Pattern:代表正则表达式的匹配模式
Matcher:提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持
案例
1、把一个字符串中带电话号码替换成130****1111
String str = "小红13012341111 小绿15112342222"; //正则表达式的字符串 String regex = "(\\d{3})(\\d{4})(\\d{4})"; String replaceAll = str.replaceAll(regex, "$1****$3"); //底层原理: // Pattern pattern = Pattern.compile(regex);//获取正则表达式的对象 // Matcher matcher = pattern.matcher(str);//匹配结果 // String replaceAll = matcher.replaceAll("$1****$3");//替换 System.out.println(replaceAll);
2、校验QQ邮箱
String str = "1445584980@qq.com"; //正则表达式的字符串 String regex = "\\d{5,10}@qq.com"; boolean matches = str.matches(regex); //底层原理: // Pattern pattern = Pattern.compile(regex);//获取正则表达式对象 // Matcher matcher = pattern.matcher(str);//获取匹配结果 // boolean matches = matcher.matches();//判断是否完全匹配 System.out.println(matches);
3、分隔路径
String str = "C:\\资源\\日韩\\波多野结衣.avi"; //正则表达式的字符串 String regex = ":?\\\\"; String[] split = str.split(regex); //底层原理 // Pattern pattern = Pattern.compile(regex);//获取正则表达式的对象 // String[] split = pattern.split(str);//分隔 for (String string : split) { System.out.println(string); }
4、Pattern+Matcher 找到前端代码中的图片路径
String str = "<img src='hhy/aaa.jpg'/><div><div/> <input type='image' src='submit.gif' /><img src='bbb.jpg'/>"; //正则表达式的字符串 String regex = "<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg)\\b)[^>]*>"; //获取正则表达式对象 Pattern pattern = Pattern.compile(regex); //获取匹配结果的对象 Matcher matcher = pattern.matcher(str); // System.out.println("在字符串中是否整个匹配:" + matcher.matches()); // System.out.println("在字符串中是否开头就匹配:" + matcher.lookingAt()); // System.out.println("在字符串中是否有包含匹配:" + matcher.find()); //遍历查找 while(matcher.find()){ String group = matcher.group(2);//获取匹配结果 System.out.println(group); }
总结
Pattern与Matcher一起合作
Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.
单独用Pattern只能使用Pattern.matches(String regex,CharSequence input)一种最基础最简单的匹配。
经验:
正则表达式在工作中实际应用在验证邮箱、验证手机号码、替换字符串
正则表达式几乎不用我们自己写,百度即可
二、关于日期时间的类
1、Date 日期类
Date date = new Date(); //星期 月份 日期 时:分:秒 时区 年份 //Thu Aug 05 11:23:00 CST 2021 System.out.println(date); //自1970.1.1 0:0:0 往后推1000毫秒的时间 // Date date = new Date(1000); //Thu Jan 01 08:00:01 CST 1970 // System.out.println(date);
2、SimpleDateFormat 格式化日期类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //将Date 转 字符串 String format = sdf.format(new Date()); System.out.println(format); ///将字符串 转 Date Date date = sdf.parse("2021年08月05日 11:28:61"); System.out.println(date);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F6ctg6lv-1628161432556)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20210805172351996.png)]
3、Calendar 日历类
//获取日历类的对象 Calendar c = Calendar.getInstance(); //获取单个的日历信息 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1;//月份0~11 int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); System.out.println(year); System.out.println(month); System.out.println(day); System.out.println(hour); System.out.println(minute); System.out.println(second);
4、总结
Date + SimpleDateFormat:获取一连串日期数据
Calendar:获取单个日期数据
三、Math类
Math 类提供了一序列基本数学运算和几何函数的方法。
Math类是final类,并且它的所有成员变量和成员方法都是静态的。System.out.println("求平方:" + Math.pow(3, 2));//9.0 System.out.println("求平方根:" + Math.sqrt(9));//3.0 System.out.println("求绝对值:" + Math.abs(-100));//100 System.out.println("向上取整(天花板):" + Math.ceil(1.001));//2.0 System.out.println("向下取整(地板):" + Math.floor(1.99));//1.0 System.out.println("求最大值:" + Math.max(10, 20));//20 System.out.println("求最小值:" + Math.min(10, 20));//10 System.out.println("四舍五入:" + Math.round(1.4));//1 System.out.println("获取随机值(0包含~1不包含):" + Math.random());
1、随机出1~100的数字
因为Math.random()方法是随机到 [0,1) 的double数据,所以要通过运算使得范围扩大
System.out.println((int)(Math.random()*100) + 1);
2、Math.abs() 有可能返回负数吗?
有可能,当遇到数据超出 int 的最大值时
System.out.println(Math.abs(Integer.MAX_VALUE+1));
3、静态导入
将Math类中所有的静态属性和静态方法都导入Test_04 这个类中,把导入的静态属性和静态方法都认为是Test_04 自己的内容
静态导入缺点:可读性不高
如果本类中有和静态导入类相同的方法,会就近调用本类中的方法
import static java.lang.Math.*; public class Test04 { public static void main(String[] args) { /** * 知识点:静态导入 */ System.out.println("求平方:" + pow(3, 2));//9.0 System.out.println("求平方根:" + sqrt(9));//3.0 System.out.println("求绝对值:" + abs(-100));//100 System.out.println("向上取整(天花板):" + ceil(1.001));//2.0 System.out.println("向下取整(地板):" + floor(1.99));//1.0 System.out.println("求最大值:" + max(10, 20));//20 System.out.println("求最小值:" + min(10, 20));//10 System.out.println("四舍五入:" + round(1.4));//1 //静态导入缺点:可读性不高 //如果本类中有和静态导入类相同的方法,会就近调用本类中的方法 System.out.println("获取随机值(0包含~1不包含):" + random()); } private static int random() { return 123456789; } }
四、Random随机类的使用
1、随机类的基本使用
//创建随机类的对象 Random ran = new Random(); int nextInt1 = ran.nextInt(); System.out.println("随机出int取值范围内的数字:" + nextInt1); int nextInt2 = ran.nextInt(10); System.out.println("随机出0~9的数字:" + nextInt2); boolean nextBoolean = ran.nextBoolean(); System.out.println("随机出boolean值:" + nextBoolean);
2、 需求:点名器
//创建随机类的对象
Random ran = new Random();String[] names = {"刘洋","陶瑞","尹翔","张涛","李科","朱鉴","林成"}; int index = ran.nextInt(names.length); System.out.println(names[index]);
3、深入Random
随机全靠种子数,种子数固定,随机出的数据也是固定的
public class MyRandom { //种子数 private long seed; public MyRandom() { //seedUniquifier() ^ System.nanoTime() 获取到相对随机的种子数 this(seedUniquifier() ^ System.nanoTime()); } public static long seedUniquifier(){ //当前时间的long类型 long current = System.currentTimeMillis(); for(;;){ //种子的算法 ...... //判断返回种子 if(......){ return current; } } } public MyRandom(long seed){ this.seed = seed; } public int nextInt(){ return (int) seed; } //求余后始终输出[0,i) public int nextInt(int i){ return Math.abs((int) seed) % i; } } Random ran = new Random(); System.out.println(ran.nextInt()); System.out.println(ran.nextInt(100)); System.out.println("--------------"); MyRandom myRandom = new MyRandom(); System.out.println(myRandom.nextInt()); System.out.println(myRandom.nextInt(10));
五、Runtime - 运行环境类
1、常用方法
//获取运行环境对象 Runtime run = Runtime.getRuntime(); System.out.println("获取最大内存数(字节):" + run.maxMemory()); System.out.println("获取闲置内存数(字节):" + run.freeMemory()); System.out.println("获取处理数:" + run.availableProcessors());
2、测试程序效率(时间、内存)
//获取自1970.1.1 0:0:0到现在的毫秒数 Runtime run = Runtime.getRuntime(); long startTime = System.currentTimeMillis(); long startMemory = run.freeMemory(); //待测方法 ...... long endMemory = run.freeMemory(); long endTime = System.currentTimeMillis(); System.out.println("消耗时长:" + (endTime-startTime));//5 System.out.println("消耗内存:" + (startMemory-endMemory));//2457664
消耗内存有时候会是负数,这是因为 JVM 虚拟机的回收机制
六、:System(系统类)
1、System(系统类)的属性
//系统标准的输入流(方向:控制台 -> 程序) InputStream in = System.in; Scanner scan = new Scanner(in); String next = scan.next(); //系统标准的输出流(方向:程序 -> 控制台) // PrintStream out = System.out; // out.println(next); //系统标准的错误输出流(方向:程序 -> 控制台) PrintStream err = System.err; err.println(next); //关闭资源 scan.close();
2、System的out和err
System.out.println("小明"); System.err.println("小红"); System.out.println("小强");
上述代码在运行时输出顺序每一次都可能不同
理解:out和err是两个线程,谁抢到CPU资源就运行
说明:多线程的程序随机性很强
3、System的方法
//获取系统参数的对象 Properties properties = System.getProperties(); System.out.println(properties); //通过键获取值 String value = System.getProperty("os.name"); System.out.println(value); //退出当前虚拟机 System.exit(0);
“小红”);
System.out.println("小强");
上述代码在运行时输出顺序每一次都可能不同 理解:out和err是两个线程,谁抢到CPU资源就运行 说明:多线程的程序随机性很强
3、System的方法
//获取系统参数的对象 Properties properties = System.getProperties(); System.out.println(properties); //通过键获取值 String value = System.getProperty("os.name"); System.out.println(value); //退出当前虚拟机 System.exit(0);