2019-05-23 Java学习日记之正则表达式&常用工具类
正则表达式
概述:
是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.
其实就是一种规则.有自己特殊的应用.
作用:
比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,
这个限制长度的事情就是正则表达式做的
package com.regex; public class Demo1 { public static void main(String[] args) { // 非正则表达式实现 System.out.println(checkQQ("012345")); // 正则表达式实现 String regex = "[1-9]\\d{4,14}"; System.out.println("111111".matches(regex)); } /** * 需求:校验qq号码 * 1、要求必须是5-15位数字 * 2、开头不能为0 * 3、必须都是数字 * 校验qq * 1、明确返回值类型boolean * 2、明确参数列表String qq */ public static boolean checkQQ(String qq) { boolean flag = true; // 如果校验qq不符合要求就把flag设置为false,如果符合要求则直接返回 if (qq.length() >= 5 && qq.length() <= 15) { if (!qq.startsWith("0")) { char[] arr = qq.toCharArray(); // 将字符串转换成字符数组 for (int i = 0; i < arr.length; i++) { char ch = arr[i]; if (!(ch >= '0' && ch <= '9')) { flag = false; // 不是数字 break; } } } else { flag = false; // 以0开头,不符合qq标准 } } else { flag = false; // 长度不符合 } return flag; } }
正则表达式的分割功能:
String类的功能:public String[ ] split(String regex)
把给定字符串中的数字排序:
package com.regex; import java.util.Arrays; public class Test1 { /** * 需求:将"91 27 46 38 50"这个字符串通过代码实现输出"27 38 46 50 91"这个结果 * 分析: * 1,将字符查UN切割成字符串数组 * 2,将字符串转换成数字并将其存储在一个等长度的int数组中 * 3,排序 * 4,将排序后的结果遍历并拼接成一个字符串 */ public static void main(String[] args) { String s = "91 27 46 38 50"; //1,将字符查UN切割成字符串数组 String[] sArr = s.split(" "); // 2,将字符串转换成数字并将其存储在一个等长度的int数组中 int[] arr = new int[sArr.length]; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(sArr[i]); //将数字字符串转换成数字 } //3,排序 Arrays.sort(arr); //4,将排序后的结果遍历并拼接成一个字符串 /*String str = ""; for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { str += arr[i]; }else { str += arr[i] + " "; } } System.out.println(str);*/ StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { sb.append(arr[i]); }else { sb.append(arr[i] + " "); } } System.out.println(sb); } }
正则表达式的分组功能:
捕获组可以通过从左到右计算其开括号来编号.
组零始终代表整个表达式
a:切割
需求:请按照叠词切割:"adqqfgkkkjppppa1"
b:替换
需求:我我我...我..我.我...爱爱爱....爱.爱..爱...学..学.学.学学学......习习习习.习.习
将字符串还原成:我爱学习
public static void demo3() { String s = "我我我...我..我.我...爱爱爱....爱.爱..爱...学..学.学.学学学......习习习习.习.习"; String s2 = s.replaceAll("\\.", ""); String s3 = s2.replaceAll("(.)\\1+", "$1"); //$1代表第一组中的内容 System.out.println(s3); } public static void demo2() { String s = "adqqfgkkkjppppa1"; String regex = "(.)\\1+"; //+代表第一组出险一次到多次 String[] arr = s.split(regex); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void demo1() { //叠词 快快乐乐,高高兴兴 /*String regex = "(.)\\1(.)\\2"; System.out.println("快快乐乐".matches(regex)); System.out.println("快快快乐".matches(regex)); System.out.println("快乐快乐".matches(regex)); System.out.println("高高兴兴".matches(regex));*/ //叠词 死啦死啦,快快乐乐 String regex = "(..)\\1"; System.out.println("死啦死啦".matches(regex)); System.out.println("快快快乐".matches(regex)); System.out.println("快乐快乐".matches(regex)); System.out.println("高高兴兴".matches(regex)); }
Pattern和Matcher:
模式和匹配器的典型调用顺序:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matchers();
正则表达式的获取功能:
Pattern和Matcher的结合使用
需求:把一个字符串中的手机号码获取出来
package com.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo3 { public static void main(String[] args) { String s = "我的手机号码是:13912345678,曾经用过13838383388,还有13345678910"; String regex = "1[3578]\\d{9}"; //手机号码的正则表达式 Pattern p = Pattern.compile(regex); Matcher m = p.matcher(s); while (m.find()) { System.out.println(m.group()); } } }
Math类的概述和使用:
A:概述
Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
B:成员方法
public static int abs(int a)
public static double ceil(double a)
public static double floor(double a)
public static int max(int a,int b)
public static double pow(double a,double b)
public static random()
public static int round(float a)
public static double sqrt(double a)
public class Demo4 { public static void main(String[] args) { System.out.println(Math.PI); System.out.println(Math.abs(-10)); // 取绝对值 /** * ceil天花板 */ System.out.println(Math.ceil(12.3)); // 向上取整,但是结果是一个double System.out.println(Math.ceil(12.99)); System.out.println(Math.floor(12.3)); //向下取整,但是结果是一个double数 System.out.println(Math.floor(12.99)); //获取两个值中的最大值 System.out.println(Math.max(20, 30)); //前面的数是底数,后面的数是指数 System.out.println(Math.pow(2, 3)); //生成0.0到1.0之间的所有小数,包括0.0,不包括1.0 System.out.println(Math.random()); //四舍五入 System.out.println(Math.round(12.3f)); System.out.println(Math.round(12.9f)); //开平方 System.out.println(Math.sqrt(4)); System.out.println(Math.sqrt(3)); System.out.println(Math.sqrt(2)); } }
Random类的概述和方法使用:
A:概述:
此类用于产生随机数如果用相同的种子创建两个Random实例
则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列
B:构造方法
public Random()
public Random(long seed)
C:成员方法
public int nextInt()
public int nextInt(int n)
import java.util.Random; public class Demo5 { public static void main(String[] args) { Random r = new Random(); /*int x = r.nextInt(); System.out.println(x); for (int i = 0; i < 10; i++) { System.out.println(r.nextInt()); }*/ Random r2 = new Random(1000); int a = r2.nextInt(); int b = r2.nextInt(); System.out.println(a); System.out.println(b); }
System类的概述和方法使用:
A:概述
System类包含一些有用的类字段和方法。它不能被实例化
B:成员方法
public static void gc()
public static void exit(int status)
public static long currentTimeMillis()
public static void arraycopy(Object src, int srcPos,Object dest, int destPos,int length)
public static void demo4() { int[] src = {11,22,33,44,55}; int[] dest = new int[8]; for (int i = 0; i < dest.length; i++) { System.out.println(dest [i]); } System.out.println("---------------"); System.arraycopy(src, 0, dest, 0,src.length); //将数组内容拷贝 for (int i = 0; i < dest.length; i++) { System.out.println(dest [i]); } } public static void demo3() { long start = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) { System.out.println("*"); } long end = System.currentTimeMillis(); //获取当前时间的毫秒值 System.out.println(end - start); } public static void demo2() { System.exit(0); //非0 状态是异常终止,退出jvm System.out.println("1111111"); } public static void demo1() { for (int i = 0; i < 100; i++) { new Demo(); System.gc(); } }
BigInteger类的概述和方法使用:
A:概述
可以让超过Integer范围内的数据进行运算
B:构造方法
publlic BigInteger(String val)
C:成员方法
public BigInteger add(BigInteger val)
public BigInteger subtract(BigInteger val)
public BigInteger multiply(BigInteger val)
public BigInteger divide(BigInteger val)
public BigInteger[ ] divideAndRemainder(BigInteger val)
public class Demo7 { public static void main(String[] args) { BigInteger bi1 = new BigInteger("100"); BigInteger bi2 = new BigInteger("2"); System.out.println(bi1.add(bi2)); // + System.out.println(bi1.subtract(bi2)); // - System.out.println(bi1.multiply(bi2)); // * System.out.println(bi1.divide(bi2)); // / BigInteger[] arr = bi1.divideAndRemainder(bi2);//取除数和余数 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
BigDecimal类的概述和方法使用:
A:概述
由于在运算的时候,float类型和double类型很容易丢失精度
所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal
不可变的、任意精度的有符号十进制数
B:构造方法
public BigDecimal(String val)
C:成员方法
public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor)
import java.math.BigDecimal; public class Demo8 { public static void main(String[] args) { /*BigDecimal bd1 = new BigDecimal(2.0); //这种方式在开发中不推荐,因为不够精确 BigDecimal bd2 = new BigDecimal(1.1); System.out.println(bd1.subtract(bd2));*/ /*BigDecimal bd1 = new BigDecimal("2.0"); //通过构造中传入字符串的方式,开发时推荐 BigDecimal bd2 = new BigDecimal("1.1"); System.out.println(bd1.subtract(bd2));*/ BigDecimal bd1 = BigDecimal.valueOf(2.0); //这种方式在开发中也是可以使用的 BigDecimal bd2 = BigDecimal.valueOf(1.1); System.out.println(bd1.subtract(bd2)); }
Date类的概述和使用方法:
A:概述
类Date表示特定的瞬间,精确到毫秒
B:构造方法
public Date()
public Date(long date)
C:成员方法
public long getTime()
public void setTime(long time)
public static void demo1() { Date d1 = new Date(); //如果没有传参数代表的是当前时间 System.out.println(d1); Date d2 = new Date(0); //如果构造方法中参数传为0代表的是1970年1月1日 System.out.println(d2); } public static void demo2() { Date d1 = new Date(); System.out.println(d1.getTime()); //通过时间对象获取毫秒值 System.out.println(System.currentTimeMillis()); //通过系统类的方法获取当前时间毫秒值 }
SimplleDateFormat类实现日期和字符串的相互转换:
A:概述
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。
是抽象类,所以使用期子类SimpleDateFormat
B:SimpleDateFormat构造方法
public SimpleDateFormat()
public SimpleDateFormat(String pattern)
C:成员方法
public final String format(Date date)
public Date parse(String source)
public static void demo4() throws ParseException { //将日期字符串转换成日期对象 String str = "2000年06月04日 08:08:08"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date d = sdf.parse(str); //将时间字符串转换成日期对象 System.out.println(d); } public static void demo3() { Date d = new Date(); //获取当前时间对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //创建日期格式化对象 System.out.println(sdf.format(d)); //将日期对象转换为字符串 } public static void demo2() { Date d = new Date(); //获取当前时间对象 SimpleDateFormat sdf = new SimpleDateFormat(); //创建日期格式化类对象 System.out.println(sdf.format(d)); //19-5-25 下午1:03 } public static void demo1() { //DateFormat df = new DateFormat(); //DateFormat是抽象类,不允许实例化 //DateFormat df1 = new SimpleDateFormat(); DateFormat df1 = DateFormat.getDateInstance();//相当于父类引用指向子类对象,右边的方法返回一个子类对象 }
Demo:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test2 { /** * 需求:算一下你来到这个世界多少天? * 分析: * 1、将生日字符串和今天字符串存在String类型的变量中 * 2、定义日期格式化对象 * 3、将日期字符串转换成日期对象 * 4、通过日期对象获取时间毫秒值 * 5、将两个时间毫秒值相减除以1000,再除以60,再除以60,再除以24得到天 * @throws ParseException */ public static void main(String[] args) throws ParseException { //1、将生日字符串和今天字符串存在String类型的变量中 String birthday = "2000年06月04日"; String today = "2019年05月25日"; //2、定义日期格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); //3、将日期字符串转换成日期对象 Date d1 = sdf.parse(birthday); Date d2 = sdf.parse(today); //4、通过日期对象获取时间毫秒值 long time = d2.getTime() - d1.getTime(); //5、将两个时间毫秒值相减除以1000,再除以60,再除以60,再除以24得到天 System.out.println(time / 1000 / 60 /60 /24); } }
Calendar类的概述和获取日期的方法:
A:概述
Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF、HOUR
等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下个星期的日期)提供了一些方法
B:成员方法
public static Calendar getInstance()
public int get(int field)
import java.util.Calendar; public class Demo1 { public static void main(String[] args) { Calendar c = Calendar.getInstance(); // 父类引用指向子类对象 // System.out.println(c); System.out.println(c.get(Calendar.YEAR)); // 通过字段获取年 System.out.println(c.get(Calendar.MONTH));// 通过字段获取月,但是月是从0开始编号的 System.out.println(c.get(Calendar.DAY_OF_MONTH));// 月中的第几天 System.out.println(c.get(Calendar.DAY_OF_WEEK));// 周日是第一天,周六是最后一天 System.out.println(c.get(Calendar.YEAR) + "年" + getNum((c.get(Calendar.MONTH) + 1)) + "月" + getNum(c.get(Calendar.DAY_OF_MONTH)) + "日 " + getWeek(c.get(Calendar.DAY_OF_WEEK))); } /** * 将星期存储表中进行查表 * 1、返回值类型String * 2、参数列表int week */ public static String getWeek(int week) { String[] arr = { "", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; return arr[week]; } /** * 如果是个位数字前面补0 * 1、返回值类型String类型 * 2、参数列表,int num */ public static String getNum(int num) { /* * if (num > 9) { return "" + num; }else { return "0" + num; } */ return num > 9 ? "" + num : "0" + num; } }
Calendar类的add()和set()方法:
成员方法:
public void add(int field,int amount)
public final void set(int year,int month,int date)
如何获取任意年份是平年还是闰年:
需求:
键盘录入任意一个年份,判断该年是闰年还是平年
import java.util.Calendar; import java.util.Scanner; public class Test3 { /** * 需求:键盘录入任意一个年份,判断该年是闰年还是平年 * Calendar c = Calenda.getInstance(); * * 分析: * 1、键盘录入年Scanner * 2、创建Calendar c = Calenda.getInstance(); * 3、通过set方法设置为那一年的3月1日 * 4、将日向前减去1 * 5、判断日是多少天,如果是29天返回true否则返回false */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入年份,判断该年份是闰年还是平年"); String line = sc.nextLine(); //录入数字字符串 int year = Integer.parseInt(line); //将数字字符串转换成数字 boolean b = getYear(year); System.out.println(b); } private static boolean getYear(int year) { //2、创建Calendar c = Calenda.getInstance(); Calendar c = Calendar.getInstance(); //3、通过set方法设置为那一年的3月1日 c.set(year,2,1); //4、将日向前减去1 c.add(Calendar.DAY_OF_MONTH, -1); //5、判断日是多少天,如果是29天返回true否则返回false return c.get(Calendar.DAY_OF_MONTH) == 29; } }