正则表达式
正则表达式定义字符串的搜索模式,其它语言也适用
语法规则:
. 匹配任何字符
^ 匹配输入字符串开始的位置。
$ 匹配输入字符串结尾的位置。
[abc] 匹配组中出现的单个字母A或B或C。例如,"[abc]"匹配”jian”中的”a”。。
[abc][vz] 匹配2个字符,第一个匹配a或b或c,第二个匹配v或z。
[^abc] 匹配未包含的任何字符。例如,"[^abc]"匹配”an”中”n”。
[a-d1-7] 匹配范围:从a-d和数字1-7之间的单个字符,
a|b 匹配a或者b,优先匹配前者,匹配上就不在匹配后者
() 优先匹配括号内的表达式
元字符 :
一个预先定义的字符
\d 数字字符匹配。
\D 非数字字符匹配。
\s 匹配任何空白字符,包括空格、制表符、换页符等。
\S 匹配任何非空白字符。
\w 垂直制表符匹配。
\W 匹配任何字类字符,包括下划线。
\S 匹配任何非空白字符
\b 匹配一个单词边界
\\ 匹配一个反斜线
\t 匹配一个制表符
\n 匹配一个换行符
\r 匹配一个回车符
量词
* 出现零次或更多次
+ 发生一次或多次
? 发生0次或一次
{n} 非负整数。正好匹配 n 次。
{n,m} 匹配n-m次
*? ?放在量词后表示非贪婪匹配
与正则表达式相关的方法
java.util.regex下的Pattern类和Matcher类提供了对正则的支持
使用Pattern类进行字符串的拆分,
使用的方法是String[] split(CharSequence input)
使用Matcher类进行字符串的验证和替换,
匹配使用的方法是boolean matches()
替换使用的方法是 String replaceAll(String replacement)
为了方便我们很少直接使用Pattern类或Matcher类,
而是使用String类下的方法
String s = "abcfg1254gfg";
//字符串是否匹配正则表达式,返回true/false
System.out.println(s.matches("[a]"));//fasle
//根据正则切割字符串,返回字符串数组
s.split("[g]")
//根据正则替换字符串
System.out.println(s.replaceAll("[\\d]", "h"));//替换数字为h字符串
//匹配11位手机号
String s = "15545865951";
System.out.println(s.matches("(13|14|15|17|18|19)[0-9]{9}"));//true
System.out.println(s.matches("1[345789][\\d]{9}"));//true
String类没有获取匹配成功后返回匹配项的方法
如果需要返回匹配的结果项,可以使用Pattern类和Matcher类
String s = "1.5-0.3+3.5+6-7";
//定义一个正则模式对象,匹配正整数
Pattern pattern = Pattern.compile("\\d+");
// 通过模式对象得到一个匹配器对象
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {// 如果满足匹配规则,返回true
System.out.print(matcher.group() + " ");// 取出满足条件的值
}//1 5 0 3 3 5 6 7
//结果并不是我们想象的数值,应该先取小数再取整数
//重新定义正则规则,优先匹配小数\\d+\\.\\d+,小数匹配不上再匹配整数
Pattern pattern = Pattern.compile("\\d+\\.\\d+|\\d+");
//1.5 0.3 3.5 6 7
//负数没有匹配上
//再次定义,优先匹配负数
Pattern pattern = Pattern.compile("-\\d+\\.\\d+|-\\d+|\\d+\\.\\d+|\\d+");
//还可以定义匹配小数点后1位至3位数\\d+\\.\\d{1,3}
Date类
日期类,提供了针对日期进行操作的诸多方法,精确到毫秒值
1000毫秒 = 1秒
Date类现在并不推荐使用,Java推荐了Calendar和DateFormat,
甚至SimpleDateFormat来替代它
//Date类的空参构造默认返回当前系统的时间,改变系统时间,date的值也会变
Date date = new Date();
System.out.println(date);//Wed Feb 05 21:25:07 CST 2050
//Date类的有参构造,传入一个long类型的毫秒值,自动转为对应的具体时间
Date date = new Date(System.currentTimeMillis());
//System.currentTimeMillis()返回系统当前距离1970年0点0分0秒的毫秒值
Date date = new Date(0);
System.out.println(date);
//Thu Jan 01 08:00:00 CST 1970
//获取当前时间的毫秒值,和System.currentTimeMillis()作用一致
date.getTime()
//修改当前时间,传入一个long类型的毫秒值,将之转为时间赋值为date
date.setTime(10000000);
//其余方法
//Date1.after(Date2),当Date1大于Date2时,返回TRUE
//Date1.before(Date2),当Date1小于Date2时,返回TRUE
DateFormat类
进行日期格式的转化
由于是抽象类只能使用它的子类SimpleDateFormat
DateFormat类的方法String format(Date date):将日期格式转换为字符串
DateFormat类的方法Date parse(String str):将String转换为Date类型
// 将String转为Date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2050-5-9");
System.out.println(date);
// Mon May 09 00:00:00 CST 2050
//将Date类型转为String
String format = sdf.format(date);
System.out.println(format);//2050-05-09
Calendar类
日历类,功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息
替换了很多Date类的方法,较常用
是一个抽象类,不能直接创建对象,通过静态方法来获取子类对象
// 获取Calendar子类对象
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);// 获取年份
int month = calendar.get(Calendar.MONTH);// 获取月份
int day = calendar.get(Calendar.DATE);// 获取日期天数
....
...
calendar.set(Calendar.DATE,10);//修改时间的日期天数
....
....
calendar.add(Calendar.DATE, 10);//天数后移10天
calendar.add(Calendar.YEAR, -10);//年份往前推10年
....
....
Date time = calendar.getTime();//将日历类对象转为日期类对象
做一个万年历
根据输入的年份和月份,自动输出对应的每月的日历表
星期一 星期二 星期三 星期四 星期五 星期六 星期日
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29
package wnl;
import java.util.Scanner;
/*
* 根据输入的年份和月份获取当月的月历
* 1.1900年1月1日为星期1
* 2.根据输入年份获取距离1990年的天数,并判断闰年平年,能被4整除并且不能被100整除或能被400整除的为闰年
* 3.根据输入月份获取之前所有月份相加的天数
* 4.前2者天数相加+1,对7求余得到的就是输入月份的1号是星期几
* 5.遍历输出当前月份的月历
*
*/
public class wnl_1 {
public static void main(String[] args) {
//键盘输入年份和月份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();
System.out.println("请输入月份:");
int month = sc.nextInt();
//计算当年距离1900年的天数
int yearDays = 0;
for(int i = 1900;i<year;i++) {
if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
yearDays += 366;
}else {
yearDays += 365;
}
}
//判断年份是闰年还是平年
boolean x = false;
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
x = true ;
}
//计算当前月份之前的天数
int monthDays = 0;
for(int a = 1;a < month; a++ ) {
switch(a) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthDays += 31;
break;
case 4:
case 6:
case 9:
case 11:
monthDays += 30;
break;
default:
if(x) {
monthDays += 29;
}else {
monthDays += 28;
}
}
}
//将天数相加+1,求得当前月份1号的星期数
int week = (yearDays + monthDays + 1) % 7;
System.out.println(week);
//获取输入月份的天数
int mDay = 0;
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
mDay = 31;
break;
case 4:
case 6:
case 9:
case 11:
mDay = 30;
break;
default:
if(x) {
mDay = 29;
}else {
mDay = 28;
}
}
//输出月历表头
System.out.print("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\n");
for(int b = 1;b < week;b++) {
System.out.print("\t");
}
for(int c = 1;c <= mDay;c++) {
System.out.print(c+"\t");
if((c + week -1) % 7 == 0) {
System.out.println();
}
}
}
}
Math类
和数学计算有关的类
int abs(int a):绝对值
double ceil(12.34)//13.0 向上取整
double floor(12.56)//12.0 向下取整
int max(int a ,int b) 获取两个数中的最大数
double pow(double a ,double b) pow(2,3) = 8.0 //a的b次幂,double 类型
double random():随机数【0.0,1)
int round(float f):四舍五入 原理:小数加上0.5,再转换成int类取整
long round(double d):四舍五入
System类
全是静态方法,无法实例化
gc():调用垃圾回收器释放内存资源,实质是调用Object的finalize方法
exit(int n);终止当前运行的虚拟机,一般n为0,非0为异常终止
currentTimeMillis();返回毫秒为单位的当前时间
BigInteger类
可以存储数值更大的整数
构造方法:
BigInteger a = new BigInteger("100");
a.add(b) 加法
a.subtract(b) 减法
a.multiply(b) 乘法
a.divide(b) 除法
BigDecimal类
float和double容易丢失精度
0.09+0.01 = 0.0999999999999
为了精确表示,Java提供了BigDecimal类.
在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算
只有这个构造new BigDecimal(String val)数据才是准确的
a.add(b) 加法
a.subtract(b) 减法
a.multiply(b) 乘法
a.divide(b) 除法
BigDecimal d = new BigDecimal("0.09");
BigDecimal d2 = new BigDecimal("0.01");
BigDecimal bigDecimal = d.add(d2);
System.out.println(bigDecimal);
//构造器中的参数不建议传入Double,会有一定的不可预知性
//建议优先传入String