一、正则表达式

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

输出结果:

    注意:返回值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+"个月");
}
}

Java学习(正则表达式、Date类、DateFormat类、Calendar类)的更多相关文章

  1. Date、DateFormat和Calendar类的简单认识

    第三阶段 JAVA常见对象的学习 Date.DateFormat和Calendar类的简单认识 Date类 Date:表示特定的瞬间,精确到毫秒. (一) 构造方法: Date():根据当前的默认毫秒 ...

  2. Math、Random、System、BigInteger、Date、DateFormat、Calendar类,正则表达式_DAY14

    1:Math&大数据类四则运算 X abs(X x) double random()         产生随机数 double ceil(double a)   向上取整 double flo ...

  3. java ->Date、DateFormat、Calendar类

    Date类概述 类 Date 表示特定的瞬间,精确到毫秒. 毫秒概念:1000毫秒=1秒 毫秒的0点: System.currentTimeMillis()  相当于Date d = new Date ...

  4. Java—包装类、Date和SimpleDateFormat、Calendar类

    包装类 基本数据类型不能调用方法,功能简单,为了让基本数据类型也具备对象的特性,Java为每个基本数据类型提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型. 基本类型和包装类之间的对应关系 ...

  5. 16_常用API_第16天(正则表达式、Date、DateFormat、Calendar)_讲义

    今日内容介绍 1.正则表达式的定义及使用 2.Date类的用法 3.Calendar类的用法 ==========================================第一阶段======= ...

  6. 常用API(正则表达式、Date、DateFormat、Calendar)

    常用API 今日内容介绍 u 正则表达式 u Date u DateFormat u Calendar 第1章 正则表达式 1.1 正则表达式的概念 正则表达式(英语:Regular Expressi ...

  7. JAVA常用API(Date、DateFormat、Calendar、System、Math、基本数据类型包装类)

    注:本文所有内容均属个人见解,如有错误望各位大佬好心指点批评,不胜感激 本章重点单词: parse:解析 format:格式化 pattern:模式 amount:数量 filed :领域 1.Dat ...

  8. [常用类]时间内Date、SimpleDateFormat、Calendar类

    Date类的概述是util包下的,不能导入sql包的.* 类 Date 表示特定的瞬间,精确到毫秒. *构造方法 * public Date() * public Date(long date) 如果 ...

  9. java时间日期类(Date、DateFormat、Calendar)学习

    1.Date类 常用方法:long getTime(),用于返回当前时刻的毫秒值 Date d = new Date(2000); System.out.println(d.getTime());// ...

  10. Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar

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

随机推荐

  1. Jmeter之性能测试

    Jmeter除了可以做接口测试外,还可以做性能测试.在 Jmeter中做性能测试,需要做如下相关设置 图片中有10个线程,Ramp-Up Period(in seconds)=1,那么线程的启动时间间 ...

  2. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) E. Jeff and Permutation

    http://codeforces.com/contest/351/problem/E 题意: 给出一些数,可以改变任意数的正负,使序列的逆序对数量最少 因为可以任意加负号,所以可以先把所有数看作正数 ...

  3. 安装rqalpha的日志

    安装rqalpha的日志 用anaconda的控制台命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple rqalpha rqalph ...

  4. 【BZOJ】2310: ParkII 插头DP

    [题意]给定m*n的整数矩阵,求经过所有点至多一次路径的最大数值和.n<=8,m<=100. [算法]插头DP [题解]最小表示法确实十分通用,处理简单路径问题只需要状态多加一位表示独立插 ...

  5. c++刷题(21/100)树的打印、矩阵覆盖和括号生成

    题目一:把二叉树打印成多行 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问 ...

  6. 【leetcode 简单】 第九十七题 快乐数

    写一个程序,输出从 1 到 n 数字的字符串表示. 1. 如果 n 是3的倍数,输出“Fizz”: 2. 如果 n 是5的倍数,输出“Buzz”: 3.如果 n 同时是3和5的倍数,输出 “FizzB ...

  7. 【leetcode 简单】 第九十五题 数字转换为十六进制数

    给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...

  8. 键盘ASCII码

    回车键 -- CR 键0x0d   -- 16进制13 -- 10 进制'\r' -- 也可以 换行键 -- LF0x0a   -- 16进制10 -- 10 进制'\n' -- 也可以 esc键   ...

  9. 【codeforces】【比赛题解】#915 Educational CF Round 36

    虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题……悲伤. 这次的Education ...

  10. 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

    cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...