Java学习(正则表达式、Date类、DateFormat类、Calendar类)

时间:2024-11-22 08:08:01

一、正则表达式

1、概念:英语:Regular Expression,在代码中常简写为regex。正则表达式,是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。

在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。

2、 正则表达式的匹配规则:

JDK中Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。

3、正则表达式的语法规则:

字符:x

含义:代表的是字符x

例如:匹配规则为 "a",那么需要匹配的字符串内容就是 ”a”

字符:\\      打一个\打不出来,因为具有转译效果,让后面的字符失去效果

所以再加一个\,让后面的\为一个普通的\

含义:代表的是反斜线字符'\'

例如:匹配规则为"\\" 那么需要匹配的字符串内容就是 ”\”

字符:\t

含义:制表符

例如:匹配规则为"\t" ,那么对应的效果就是产生一个制表符的空间

字符:\n

含义:换行符

例如:匹配规则为"\n",那么对应的效果就是换行,光标在原有位置的下一行

字符:\r

含义:回车符

例如:匹配规则为"\r" ,那么对应的效果就是回车后的效果,光标来到下一行行首

字符类:[abc]

含义:代表的是字符a、b 或 c

例如:匹配规则为"[abc]" ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个

字符类:[^abc]

含义:代表的是除了 a、b 或 c以外的任何字符

例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符

字符类:[a-zA-Z]

含义:代表的是a 到 z 或 A 到 Z,两头的字母包括在内

例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母

字符类:[0-9]

含义:代表的是 0到9数字,两头的数字包括在内

例如:匹配规则为"[0-9]",那么需要匹配的是一个数字

字符类:[a-zA-Z_0-9]

含义:代表的字母或者数字或者下划线(即单词字符)

例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线

预定义字符类:.

含义:代表的是任何字符

例如:匹配规则为" . ",那么需要匹配的是一个任意字符。如果,就想使用 . 的话,使用匹配规则"\\."来实现

预定义字符类:\d

含义:代表的是 0到9数字,两头的数字包括在内,相当于[0-9]

例如:匹配规则为"\d ",那么需要匹配的是一个数字

\D  代表的是非数字

预定义字符类:\w

含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9]

例如:匹配规则为"\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线

边界匹配器:^

含义:代表的是行的开头

例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号

边界匹配器:$

含义:代表的是行的结尾

例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容以[0-9]这个结束, 相当于右双引号

边界匹配器:\b

含义:代表的是单词边界

例如:匹配规则为"\b[abc]\b" ,那么代表的是字母a或b或c的左右两边需要的是非单词字符([a-zA-Z_0-9])

数量词:X?

含义:代表的是X出现一次或一次也没有

例如:匹配规则为"a?",那么需要匹配的内容是一个字符a,或者一个a都没有

数量词:X*

含义:代表的是X出现零次或多次

例如:匹配规则为"a*" ,那么需要匹配的内容是多个字符a,或者一个a都没有

数量词:X+

含义:代表的是X出现一次或多次

例如:匹配规则为"a+",那么需要匹配的内容是多个字符a,或者一个a

数量词:X{n}

含义:代表的是X出现恰好 n 次

例如:匹配规则为"a{5}",那么需要匹配的内容是5个字符a

数量词:X{n,}

含义:代表的是X出现至少 n 次

例如:匹配规则为"a{5, }",那么需要匹配的内容是最少有5个字符a

数量词:X{n,m}

含义:代表的是X出现至少 n 次,但是不超过 m 次

例如:匹配规则为"a{5,8}",那么需要匹配的内容是有5个字符a 到 8个字符a之间

4.课堂练习

package com.oracle.demo01;
// 字符类中涉及正则表达式的常用方法
public class demo01 { public static void main(String[] args) {
// 校验qq号码.
// 1: 要求必须是5-15位数字
// 2: 0不能开头
String regex="[1-9][0-9]{4,14}";
String str="895949735";
boolean f=str.matches(regex);
System.out.println(f);
// 校验手机号码
// 1:要求为11位数字
// 2:第1位为1,第2位为3、4、5、7、8中的一个,后面9位为0到9之间的任意数字。
String re="1[3457][\\d]{9}";
String st="13345678911";
boolean f1=st.matches(re);
System.out.println(f1);
//分割规则 split
String str1="138-6564-8987";
String regex1="-";
String[] strr=str1.split(regex1);
//增强for
// for(定义你要遍历数组和集合的一个变量 起个名称:数组或集合名称){
// System.out.println(起的名字); // }
for(String a:strr){
System.out.println(a);
}
//按照规则替换字符串 replaceAll
String str2="java ai wo wo ai java";
String regex2="a";
String s=str.replaceAll(regex2,"b");
System.out.println(s);
//匹配合法的邮箱
String regex3="[a-zA-Z0-9_]+@[a-zA-Z0-9]+\\.[a-zA-Z]+";
String str3="895949735@qq.com";
boolean bo=str3.matches(regex3);
System.out.println(bo);
} }
package com.oracle.demo01;
//正则表达式 练习
import java.util.Scanner;
public class demo02 { public static void main(String[] args) {
//1.对输入的qq号进行匹配(qq匹配规则:长度为5-10位,纯数字组成,且不能以0开头。)
// String regex="[1-9][0-9]{4,9}";
// System.out.println("请输入您的QQ号");
// Scanner sc=new Scanner(System.in);
// String str=new String(sc.next());
// boolean f=str.matches(regex);
// if(f==true){
// System.out.println("QQ号匹配成功");
// }else{
// System.out.println("QQ号输入错误");
// }
//
// //2.对输入的电话号码进行匹配(匹配要求:匹配成功的电话号码位数为11位的纯数字,且以1开头,
// //第二位必须是:3、7、8中的一位,即只匹配13*********、17*********、18*********的电话号码)。
// String regex2="1[378][0-9]{9}";
// System.out.println("请输入电话号码");
// String str2=new String(sc.next());
// boolean f1=str.matches(regex);
// if(f1==true){
// System.out.println("手机号验证正确");
// }else{
// System.out.println("手机号号输入错误");
// }
//3.对字符串“张三@@@李四@@王五@茅台”进行切割,去掉@符号。
String str3="张三@@@李四@@王五@茅台";
String regex3="@";
String[] attr=str3.split(regex3);
for(String a:attr){
System.out.print(a);
}
System.out.println();
// 4.【以叠词切割】:如字符串"abccsasahhhz"按“叠词”来切割就变成了“ab”,“sasa”,“z”。
// 因为“cc”、“hhh”都是叠词,需要切割掉。现在请将字符串“张三@@@李四¥¥王五ssssssss江流儿”按照叠词切割。
String str4="张三@@@李四¥¥王五ssssssss江流儿";
// ()来表示组,那么组是干嘛的?我们就可以 对组中的数据进行引用:那么regex = "(.)\\1"就表示:
// 某一字符出现了两次(注意首先我们用(.)来表示任意字符,而\\1是对组(.)中的字符进行复用,合起来就是:两个相同的字符),
// 现在我们不只是需要出现两次的字符,所以使用+号来表示出现多次,最终叠词就表示为:regex = "(.)\\1+"。
String regex4="(.)\\1+";
String[] attr2=str4.split(regex4);
for(String a:attr2){
System.out.print(a);
}
System.out.println();
//5.将字符串“张三@@@李四YYY王五*****王尼玛”中的叠词替换为:“、”。
String str5=str4.replaceAll(regex4, "、");
System.out.println(str5); } }

 二、Date类

概念:Date类为时间类,表示特定的瞬间,精确到毫秒。

   毫秒概念:1000毫秒==1秒

   当前时间所转换成毫秒值  语言格式:

long name=System.currentTimeMillis();

输出结果:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

    注意:返回值long类型参数。

     时间的原点:公元1970年 一月一日,午夜0:00:00 对应的毫秒值就是0

    注意:时间和日期的计算,必须依赖毫秒值

Date类的构造函数:

常用方法:getTime(); 目的:把日期对象转换成对应的时间毫秒值

//空参构造,代表当前系统时间的日期对象。
Date d=new Date();
System.out.println(d);
//long传参构造,小括号里传的是毫秒值,转变为时间日期格式,记得在毫秒值最后 加上 L 表明是long数据类型
Date d2=new Date(2099900325650l);
System.out.println(d2);
//getTime():获取日期对象的毫秒值(Date对象转毫秒值的方法)
System.out.println(d.getTime());
System.out.println(d2.getTime())

输出结果:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

 三、DateFormat类

概念:DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间

   通过这个类可以帮我们完成日期和文本之间的转换。

日期格式:

   DateFormat是抽象类,我们需要使用其子类SimpleDateFormat来创建对象

         Java学习(正则表达式、Date类、DateFormat类、Calendar类)

构造方法:DateFormat类方法

1.foamat方法: 用来将Date对象转换成String

   Java学习(正则表达式、Date类、DateFormat类、Calendar类)

//对日期格式化,设置成自己想要的格式   加空格后也会相应的显示出来
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd月 HH:mm:ss");
//空参构造为当前时间
Date d=new Date();
//将日期转为字符串 String name=format(date); ( 将一个date日期格式化为制定好的格式 )
String date=sdf.format(d);
System.out.println(date);

 运行结果:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

2.parse方法:用来将String转换成Date(转换时,该String要符合指定格式,否则不能转换)。

SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
String str=new String("3003年09月26日");
Date d=sdf.parse(str);
System.out.println(d);

运行结果:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

四、Calendar类(日历类)

概念:

Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。

Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言敏感内容处理好,再返回子类对象。

 Calendar类静态方法:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

Calendar c=Calendar.getInstance();     //返回当前时间

 打印结果:

java.util.GregorianCalendar[time=1527580612238,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=4,WEEK_OF_YEAR=22,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=149,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=56,SECOND=52,MILLISECOND=238,ZONE_OFFSET=28800000,DST_OFFSET=0]
//可以看到,已经将所有有关时间的信息都打印了出来

 Calendar类常用方法:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

语法格式:public static Calendar getInstance()     获取日期对象

     public int get(int field)                            获取时间字段值

       public void add(int field,int amount)       指定字段增加某值

public final void set(int field,int value)    设置指定字段的值

public final Date getTime()                    获取该日历对象转成的日期对象

        //首先获取日期对象,才从对象中提取想要提取的时间信息
     Calendar c=Calendar.getInstance();
//获取当前年份
System.out.println(c.get(Calendar.YEAR));
//每一周的哪一天,需要-1 才是正确显示的日期
System.out.println(c.get(Calendar.DAY_OF_WEEK)-1);
//月份需要+1 才是正确显示的月份
System.out.println(c.get(Calendar.MONTH)+1);
System.out.println(c.get(Calendar.DATE));
//向后偏移三天 +3天
c.add(Calendar.DATE, 3);
//将日历类转变为日期类
Date d=c.getTime();
System.out.println(d);
//设置指定日期 set
c.set(Calendar.YEAR,2098);
c.set(Calendar.MONTH, 6);
c.set(Calendar.DATE, 6);
     //第二种设置方法
c.set(2055, 10, 30);
Date da=c.getTime();
System.out.println(da);

打印结果:

Java学习(正则表达式、Date类、DateFormat类、Calendar类)

  注   意  :

1.西方星期的开始为周日,中国为周一。

2.在Calendar类中,月份的表示是以0-11代表1-12月。

3.日期是有大小关系的,时间靠后,时间越大。

 时间类练习题:

import java.util.Scanner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; public class Demo1 { public static void main(String[] args) throws ParseException {
// 1.如何获取当前的月份?
one();
//2.如何知道现在距离指定的时间还有多久?
two();
//3.请将当前日期按照"2018年4月3日 22点22分22秒"打印在控制台
three();
//4.请将"2068年3月3日 15:07:04:"转成date类型打印在控制台
four();
//5.控制台输入一个人的生日,判断截至到当前日期他活了多少个月?
five(); }
//第一题
public static void one(){
Calendar c=Calendar.getInstance();
System.out.println("当前月份是:"+(c.get(Calendar.MONTH)+1)+"月");
}
//第二题
public static void two(){
//获取当前的毫秒值
long today=System.currentTimeMillis();
//设置指定的时间
Calendar c=Calendar.getInstance();
c.set(2999,11,31);
//将日历类转为日期类
Date d=c.getTime();
//获取指定时间的毫秒值
long dday=d.getTime();
long day=(dday-today)/1000/60/60/24;
System.out.println("距离指定的时间还有"+day+"天");
}
//第三题
public static void three(){
//对日期格式化,设置成自己想要的格式 加空格后也会相应的显示出来
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//空参构造为当前时间
Date d=new Date();
//将日期转为字符串 String name=format(date); ( 将一个date日期格式化为制定好的格式 )
String date=sdf.format(d);
System.out.println(date);
}
//第四题
public static void four() throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str=new String("2068年3月3日 15:07:04");
Date d=sdf.parse(str);
System.out.println(d);
}
//第五题
public static void five(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入出生年");
int y=sc.nextInt();
System.out.println("请输入出生月");
int m=sc.nextInt();
System.out.println("请输入出生日");
int d=sc.nextInt();
//将输入的年月日添加到日历类中
Calendar c=Calendar.getInstance();
c.set(y, m, d);
//获取今天的毫秒数
long today=System.currentTimeMillis();
//转换成日期类
Date da=c.getTime();
//转换成毫秒数
long birth=da.getTime();
//算出多少月
long month=(today-birth)/1000/60/60/24/30;
System.out.println("出生至今共活了"+month+"个月");
}
}