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

一、正则表达式

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="[email protected]";
        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();

 输出结果:

 

     注意:返回值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())

 输出结果:

 

 三、DateFormat类

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

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

日期格式:

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

 

        

 

构造方法:DateFormat类方法

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

 

   

//对日期格式化,设置成自己想要的格式   加空格后也会相应的显示出来
        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);

 运行结果:

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);

运行结果:

四、Calendar类(日历类)

概念:

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

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

 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类常用方法:

语法格式: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);

 打印结果:

  注   意  :

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+"个月");
    }
}

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/0328dongbin/p/9089337.html