day14-Java正则表达式Math类日期类

14.01_常见对象(正则表达式的概述和简单使用)

  • A:正则表达式
    • 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
    • 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的
// 正则表达式  校验QQ
String regex = "[1-9]\\d{4,14}";
System.out.println("1234567".matches(regex));

14.02_字符类正则

字符类  []代表单个字符的匹配
[abc]    a、b 或 c(简单类) 
[^abc]    任何字符,除了 a、b 或 c(否定) 
[a-zA-Z]    a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
[a-d[m-p]]    a 到 d 或 m 到 p:[a-dm-p](并集) 
[a-z&&[def]]    d、e 或 f(交集) 
[a-z&&[^bc]]    a 到 z,除了 b 和 c:[ad-z](减去) 
[a-z&&[^m-p]]    a 到 z,而非 m 到 p:[a-lq-z](减去)

System.out.println("u".matches("[^abc]"));  //true
System.out.println("uP".matches("[^abc]"));  //false ,因为[]只匹配单个字符

14.03_预定义字符类正则

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

14.04_常见对象(数量词)

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

System.out.println("a".matches("[abc]?")); //true 出现了a
System.out.println("y".matches("b?")); //false ,b是一次也没有,但是还有其他字符
System.out.println("".matches("\\d?"));//true 数字一次也没有出现
System.out.println("22222".matches("[2]{3,}")); //true 2自少3次,切只能是2

14.05_正则表达式的分割功能

  • A:正则表达式的分割功能
    • String类的功能:public String[] split(String regex)
// 1.正则表达分割字符串  要求: 以 - 分割开
String s = "qwe-asd-zxc-12355";
String[] arr = s.split("-");
System.out.println(Arrays.toString(arr));

String s2 = "www.rrr.xxoo.ppp";
String[] arr2 = s2.split("\\.");  //这里比较 特殊,需要用2个\\来转义
System.out.println(Arrays.toString(arr2));

14.06_常见对象(把给定字符串中的数字排序)

  • A:案例演示
    • 需求:我有如下一个字符串:”91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”
String s = "91 27 46 38 50 100";
String[] arr = s.split(" ");  //分割字符串

int[] intArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) { //字符串数组转为int数组
    intArr[i] = Integer.parseInt(arr[i]);
}

Arrays.sort(intArr);  //int数组排序
System.out.println(Arrays.toString(intArr));

14.07_正则表达式的替换功能

  • A:正则表达式的替换功能
    • String类的功能:public String replaceAll(String regex,String replacement)
String s = "xxoo123qwer";
// \\d代表任意数字
System.out.println(s.replaceAll("\\d", "-")); //输出:xxoo---qwer

14.08_常见对象(正则表达式的分组功能)

  • A:正则表达式的分组功能
    • 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
  •   1     ((A)(B(C))) 
      2     (A 
      3     (B(C)) 
      4     (C) 
    
      组零始终代表整个表达式。
    
 // 叠词 快快乐乐 ,高高兴兴
 // "\\1"代表第一组(.)再出现一次 \\2 也代表第二组再出现一次
String regex = "(.)\\1(.)\\2";  
System.out.println("快快乐乐".matches(regex));   //true
System.out.println("xoxo".matches(regex));   //false

System.out.println("高兴高兴".matches("(..)\\1"));  //true

// 第一题: 需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
String s = "sdqqfgkkkhjppppkl";
String[] arr = s.split("(.)\\1+"); // \\1+ 代表一次或多次
System.out.println(Arrays.toString(arr));
        
// 第二题:需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
String ss1 = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";

String ss2 = ss1.replaceAll("\\.", ""); // 1.去掉.
String ss3 = ss2.replaceAll("(.)\\1+", "$1"); // 2. $1代表第一组的内容(.)
System.out.println(ss3);

14.09_Pattern和Matcher的概述

  • A:PatternMatcher的概述
  • B:模式和匹配器的典型调用顺序
    • 典型的调用顺序是
Pattern p = Pattern.compile("a*b"); // 获取正则表达式  a*b a出现0次或多次,后面跟上b
Matcher m = p.matcher("aaaaab"); // 获取匹配器
boolean b = m.matches(); //获取匹配结果

//上面三句,等价于:下面底层的实现就是上面的3句
System.out.println("aaab".matches("a*b"));

14.10_常见对象(正则表达式的获取功能)

  • A:正则表达式的获取功能
    • PatternMatcher的结合使用
// 获取字符串中的两个手机号
String s = "么么哒XXOO13509801846,我日18518607465";

Pattern p = Pattern.compile("1[3578]\\d{9}");  //手机号码正则表达式
Matcher m = p.matcher(s);

while (m.find()) 
    System.out.println(m.group());

14.11_Math类概述和方法使用

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

  • B:成员方法
public static int max(int a,int b)   //两个数的最大值  min自学
System.out.println(Math.PI); // 圆周率PI,常量
System.out.println(Math.abs(-12.5)); //结果 12.5  绝对值
System.out.println(Math.ceil(12.123)); //结果 13.0  向上取整,但是结果是double
System.out.println(Math.ceil(12.999)); //结果 13.0
System.out.println(Math.floor(12.123)); //结果 12.0  向下取整,但是结果是double
System.out.println(Math.floor(12.999)); //结果 12.0
System.out.println(Math.pow(2, 3));  //求n次方 ,这里就是2的3次方
System.out.println(Math.random()); //生成0.0到1.0之间的随机数,包括0.0,不包括1.0
System.out.println(Math.round(12.6F)); //四舍五入
System.out.println(Math.sqrt(12.4));  //开平方

14.12_Random类的概述和方法使用

  • A:Random类的概述
    • 此类用于产生随机数如果用相同的种子创建两个 Random 实例,
    • 则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
  • B:构造方法
    • public Random()
    • public Random(long seed)
  • C:成员方法
    • public int nextInt()
    • public int nextInt(int n)(重点掌握)
Random r = new Random();
for (int i = 0; i < 10; i++) {  //循环10次,生成随机数
    int x = r.nextInt(100); // 0-100 包括0,不包括100
    System.out.println(x);
}

14.13_System类的概述和方法使用

System 类包含一些有用的类字段和方法。它不能被实例化。

// 一个源文件中,不允许定义两个 public class

System.gc();  //运行垃圾回收器
System.exit(0); //退出Java虚拟机
long time = System.currentTimeMillis();  //返回当前系统的毫秒值(1970年至今的时间差)

int[] src = {11,22,33,44,55};
int[] dest = new int[8];
//数组的拷贝,这个是集合的底层实现
System.arraycopy(src, 0, dest, 0, src.length);
System.out.println(Arrays.toString(dest));

14.14_BigInteger类的概述和方法使用

  • A:BigInteger的概述:可以让超过Integer范围内的数据进行运算
  • B:构造方法
    • public BigInteger(String val)
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); //得到 除数 和 余数 (除法和取模)
System.out.println(Arrays.toString(arr));

14.15_BigDecimal类的概述和方法使用

  • 由于在运算的时候,float类型和double很容易丢失精度,演示案例。
  • 所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal
  • 不可变的、任意精度的有符号十进制数。
  • BigDecimal和上面的BigInteger有一样的方法名,都有加减乘除等。
System.out.println(2.0 - 1.1); //结果是 0.89... 精度有问题。。        

// 推荐使用字符串的形式,double不推荐, 精度不如字符串
BigDecimal bd1 = new BigDecimal("2.0");
BigDecimal bd2 = new BigDecimal("1.1");
System.out.println(bd1.subtract(bd2));

// 或者
BigDecimal bd3 = BigDecimal.valueOf(2.0);
BigDecimal bd4 = BigDecimal.valueOf(1.1);
System.out.println(bd3.subtract(bd4));

14.16_Date类的概述和方法使用

  • A:Date类的概述:Date 表示特定的瞬间,精确到毫秒
  • B:构造方法
    • public Date() 代表当前时间
    • public Date(long date) 传0代表1970年1月1号
  • C:成员方法
    • public long getTime() 获取Date对象毫秒值
    • public void setTime(long time) 设置毫秒,在1970年1月1号基础加上此毫秒值

14.17_SimpleDateFormat类实现日期和字符串的相互转换

  • DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。是抽象类,所以使用其子类SimpleDateFormat
Date d1 = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(df.format(d1)); //将日期转为字符串

//将时间字符串 转为 日期对象
String str = "2008-10-12 15:00:00";
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d2 = df2.parse(str);
System.out.println(d2);

14.18_你来到这个世界多少年案例

// 1.将生日字符串和今天字符串存在string中
String birthday = "1999年07月14日";
String today = "2016年12月09日";

// 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,/365 得到年
System.out.println(time / 1000 / 60 / 60 / 24 / 365);

14.19_Calendar类的概述和获取日期的方法

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

Calendar c = Calendar.getInstance(); //父类对象指向子类对象
System.out.println(c.get(Calendar.YEAR)); //得到年
System.out.println(c.get(Calendar.MONTH)+1); //得到月,注意是从0开始的,加是正常的
System.out.println(c.get(Calendar.DAY_OF_MONTH));//得到日
System.out.println(c.get(Calendar.WEEK_OF_MONTH));//得到第几周
System.out.println(c.get(Calendar.DAY_OF_WEEK));//得到周内第几天(周日为1,周一为2...)

System.out.println(getWeek(c.get(Calendar.DAY_OF_WEEK)));

public static String getWeek(int week) {
    if (week > 7 || week < 1) return "";
    //因为 Calendar.DAY_OF_WEEK 返回的是 1-7,1是星期日,2是星期一,类推的..
    String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    return arr[week];
}

14.20_Calendar类的add()和set()方法

//Date转为 Calendar
Calendar c1 = Calendar.getInstance();
c1.clear();
c1.setTime(new Date());;

Calendar c = Calendar.getInstance(); //父类对象指向子类对象
//  c.add(Calendar.YEAR, 1);  //年份加1一年,(负数就是减)
c.add(Calendar.MONTH, -2);  //减去2个月,年份会自动变的,比如1月减2个月,就是上一年了

c.set(Calendar.YEAR, 2015); //修改年份
c.set(2017, 11, 12);  //修改为 2017-12-12 ,注意,月份是从0开始,所以11就是12月

//Calendar转为Date
Date date = c.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(date));

14.21_如何获取任意年份是平年还是闰年)

// 判断是闰年还是平年, 2月是29天是闰年,否则是平年

Scanner sc = new Scanner(System.in);
System.out.println("请输入年份,判断该年份是闰年还是平年...");
int year = sc.nextInt();
sc.close();

Calendar c = Calendar.getInstance();
c.clear();
c.set(year, 2, 1);  //设置为 那一年的3月1日
c.add(Calendar.DAY_OF_MONTH, -1); //将日向前减去1,就是2月的最后一天
//判断是否是29天
if (29 == c.get(Calendar.DAY_OF_MONTH)) {
    System.out.println("您输入的是闰年..");
}else {
    System.out.println("您输入的是平年..");
}

END。
我是小侯爷。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。

你可能感兴趣的:(day14-Java正则表达式Math类日期类)