目录
一、正则表达式
1.1正则表达式的概述
正则表达式是用来描述或者匹配一系列符合某个语句规则的字符串,
可以用来搜索、编辑或处理文本。
在java中我们常常通过String类的matches方法来判断字符串是否匹配给定的正则表达式,
也可以直接通过Pattern类的静态方法matches直接类名加方法名调用,
boolean b = Pattern.matches("a*b", "aaaaab");
1.2字符类
"[]"在正则表达式中表示的是单个字符,常常有以下几种用法,
- [abc]:a、b或c
- [^abc]:任意字符,除了a、b或c
- [a-zA-Z]:a到z或者A到Z,包括a(A)、z(Z)
- [a-d[m-p]]:a到d或者m到p,和[a-dm-p]相同
- [a-z&&[def]]:d、e或f,取a到z和d、e或f的交集
- [a-z&&[^bc]]:a到z中,除了b或者c,与[ad-z]相同
- [a-z&&[^m-p]]:a到z中,除了m到p,与[a-lq-z]相同
1.3预定义字符类
- .:代表任意的字符
- \d:数字,范围是[0,9]
- \D:非数字,[^0-9]
- \s:空白字符,[ \t\n\x0B\f\r]
- \S:非空白字符,[^\s]
- \w:单词字符,[a-zA-Z_0-9]
- \W:非单词字符,[^\w]
1.4数量词
数量词一般接在字符后,表示前面的单个字符出现的次数,
- ?:一次或一次也没有,这里的一次也没有是特指匹配的是空字符
- *:零次或多次
- +:一次或多次
- {n}:恰好n次
- {n,}:至少n次
- {n,m}:至少n次,但不超过m次
1.5给定字符串数字排序练习
public class RegexPractice1 {
public static void main(String []args){
//如果有以下字符串:"92 55 86 31 73 15",请代码实现最终输出:"15 31 55 73 86 92"
String str="92 55 86 31 73 15";
String sArr[]= str.split(" ");//用空格将字符串分割成字符串数组
int arr[]=new int[sArr.length];
for(int i=0;i<sArr.length;i++){
arr[i]=Integer.parseInt(sArr[i]);//将数字字符串转换为数字
}
Arrays.sort(arr);//排序
StringBuilder sb=new StringBuilder();
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
sb.append(arr[i]);
}else{
sb.append(arr[i]+" ");
}
}
System.out.println(sb);
}
}
1.6正则表达式的替换功能
public String replaceAll(String regex,String replacement)//用replacement字符替换掉字符串中的满足正则表达式的字符
比如我们需要替换掉"I love 123Java"中的数字字符,我们可以通过下面的操作实现,
public class RegexPractice2 {
public static void main(String []args){
String str="I love 123Java";
String regex="\\d";//"\\d"代表任意数字
String output=str.replaceAll(regex,"");
System.out.println(output);
}
}
1.7正则表达式的分组功能
捕获组可以通过从左到右计算其开括号来编号,
例如,在表达式((A)(B(C)))中,存在四个组,
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
组零代表整个表达式,
现在我们来看一下如何写一个简单的叠词(平平安安)的正则表达式,
String regex="(.)\\1(.)\\2";//"(.)"代表将第一个字符分为一个组,后面的\\1代表将第一组再重复一次,\\2代表第二组再重复一次
System.out.println("平平安安".matches(regex));
假设现在我们要求按照叠词切割给定字符串"abbcdeffffghiiijk",目标输出结果为"a"、"cde"、"gh"、"k",
代码实现如下,
public class RegexPractice2 {
public static void main(String []args){
String str="abbcdeffffghiiijk";
String regex="(.)\\1+";//+号代表第一组出现一次或多次
String arr[]=str.split(regex);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
现在有目标字符串"我..我.....爱爱爱爱..java",要将该字符串还原为"我爱java",
public class RegexPractice2 {
public static void main(String []args){
String str="我..我.....爱爱爱爱..java";
String output=str.replaceAll("\\.+","");//先将"."去除
output=output.replaceAll("(.)\\1+","$1");//这里的"$1"代表获取第一个组中的字符
System.out.println(output);
}
}
1.8Pattern和Matcher的区别
Pattern类是正则表达式的编译表现形式,指定为字符串的正则表达式必须首先被编译为此类的实例,
然后可将得到的模式用于创建Matcher对象,该对象可以与任意字符序列匹配,典型的调用顺序如下,
Pattern p=Pattern.compile("a*b");//获取到正则表达式的编译形式
Matcher m=p.matcher("aaaaab");//创建匹配给定输入与此模式的匹配器
boolean b=m.matches();//将字符串与正则表达式进行匹配
还有更简单的写法,
boolean b = Pattern.matches("a*b", "aaaaab");
//或
boolean b = "aaaaab".matches("a*b");
1.9正则表达式的获取功能
如果要利用正则表达式获取字符串的某些字符,我们需要结合Pattern和Matcher来获取,
比如现在我们要获取字符串中的手机号,
public class RegexPractice2 {
public static void main(String []args){
String str="我爱java,18987654321,15712345678";
String regex="1[3578]\\d{9}";//手机号码的正则表达式
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
}
二、Math类
Math类是包含于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数,
其主要有以下几种成员方法,
public static int abs(int a)//绝对值
public static double ceil(double a)//向上取整
public static double floor(double a)//向下取整
public static int max(int a,int b)//求最大值
public static double pow(double a,double b)//求a^b
public static double random()//随机数
public static int round(float a)//四舍五入
public static double sqrt(double a)//开方
三、Random类
此类的实例用于生成伪随机数,在使用时有两种方法,
一个是空参构造,一个是给定一个seed种子,
Random r1=new Random();
int x=r1.nextInt();
Random r2=new Random(100);
int y=r2.nextInt();
System.out.println(x);
System.out.println(y);
通过多运行几次程序我们会发现,x每次运行值都会发生改变,而y的值不会发生改变,
这就是给定种子带来的影响,所以说Random是一种生成伪随机数的一种方法,
我们还可以指定某个范围内生成随机数,
Random r1=new Random();
int x=r1.nextInt(100);//生成0-99的随机数
四、System类
System类种包含一些有用的类字段和方法,它不能被实例化,
在System类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;
加载文件和库的方法;还有快速复制数组的一部分使用方法,
它有一些成员方法我们需要知道,
public static void gc();//运行垃圾回收器,可以手动的回收垃圾
public static void exit(int status);//终止当前正在运行的java虚拟机,此语句后面的语句都不执行,status状态码非0表示异常终止
public static long currentTimeMillis();//返回以毫秒为单位的当前时间,起始时间为1970/1/1,通常用来计算程序的运行时间
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)//从指定源数组src中复制一个数组dest,从指定位置srcPos开始复制length长度的元素,到目标数组的指定位置destPos
五、BigInteger类
BigInteger可以让超过Integer范围内的数据进行运算,其内部用一个数组来模拟一个超大的整型数据,
构造方法是传入一个String类型的字符串
public BigInteger(String val)//val字符串存储的是大的整型数据字符串
它的一些主要成员方法有以下几种,
public BigInteger add(BigInteger val)//返回this+val的求和值,返回是BigInteger类型
public BigInteger subtract(BigInteger val)//返回this-val求差的结果
public BigInteger multiply(BigInteger val)//返回this*val相乘结果
public BigInteger divide(BigInteger val)//返回this/val相除结果
public BigInteger[] divideAndRemainder(BigInteger val)//返回包含(this/val)和(this%val)的BigInteger数组
六、BigDecimal类
首先我们计算一下2-1.1的值,然后输出,
我们会发现输出的是0.8999999999999999,按道理来说应该是0.9才对,
在计算机的浮点数运算时,经常会有这种精度损失的情况出现,而BigDecimal类可以进行精确运算,
其主要用到的构造方法有以下几种,
BigDecimal(BigInteger val)//将BigInteger转换为BigDecimal
BigDecimal(double val)//将double转换为BigDecimal
BigDecimal(String val)//将double转换为BigDecimal
需要注意的是,想要进行浮点数的精确运算时,我们最好使用String参数的构造方法,
因为double参数在进行转换时,也可能会有精度损失,
同样的,它也有四则运算的成员方法,
public static BigDecimal valueOf(double val)//将double类型数据转换为BigDecimal,此方法不会有精度损失
public BigDecimal add(BigDecimal val)//返回this+val的求和值,返回是BigDecimal类型
public BigDecimal subtract(BigDecimal val)//返回this-val求差的结果
public BigDecimal multiply(BigDecimal val)//返回this*val相乘结果
public BigDecimal divide(BigDecimal val)//返回this/val相除结果
七、Date类
类Date表示特定的瞬间,精确到毫秒,
其构造方法主要有两个,
Date()//分配Date对象并初始化,表示随机分配它的时间
Date(long date)//表示从1970/1/1的0点开始经过date毫秒数的时间
但是我们如果打印Date(0)代表的时间,一般会得到的是1970/1/1的8点,
因为我们在东八区,所以是8点而不是0点,
Date还有两个常用的成员方法,
public long getTime()//获取系统当前时间,距离1970/1/1的毫秒数
public long setTime(long time)//设置时间,距离1970/1/1的毫秒值
八、SimpleDateFormat类
DateFormat类是日期/时间格式化类的抽象类,是SimpleDateFormat的父类,是用来对日期类进行格式化的,
它以与语言无关的方式格式化并解析日期或事件,是抽象类,我们一般使用它的子类SimpleDateFormat,
SimpleDateFormat类的构造方法有以下几种,
public SimpleDateFormat()//用默认的模式和默认语言环境的日期格式构造
public SimpleDateFormat(String pattern)//用给定的模式和给定语言环境的日期格式构造
成员方法如下,
public final String format(Date date)//将给定的Date格式化为日期/时间字符串
public Date parse(String source)//
比如我们如果想以年月日时分秒的形式对日期进行格式化输出,可以这样实现,
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String []args){
Date d=new Date();
System.out.println(d);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf.format(d));
}
}
我们还可以通过parse方法将时间字符串转换为日期对象,
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String []args) throws ParseException {
String str="1998年09月02日08:00:00";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
Date d=sdf.parse(str);
System.out.println(d);
}
}
九、Calendar类
9.1Calendar类的概述
Calendar类是一个抽象类,是用来表示日历时间的一个类,
它为特定瞬间与一组诸如YEAR,MONTH,DAY_OF_MONTH,HOUR等日历字段之间的转换提供了一些方法,
并为操作日历字段(例如获取下星期日期)提供了一些方法,
public static Calendar getInstance()//获取当前日历信息
public int get(int field)//获取日历某个字段的数据
public class DateTest {
public static void main(String []args){
Calendar cal=Calendar.getInstance();
System.out.println(cal);
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DATE));
}
}
这里需要注意,它打印出来的月份是0,因为日历中月是从0开始编号的,到11结束,
9.2Calendar类的add()和set()方法
public void add(int field,int amount)//对字段进行加减,amount为正则为加,amount为负则为减
public final void set(int field,int amount)//修改指定字段
public final void set(int year,int month,int date)//修改年月日
9.3平年闰年判断
import java.util.Calendar;
import java.util.Scanner;
public class DateTest {
public static void main(String []args){
//键盘录入一个年份,判断平年还是闰年
System.out.println("请输入年份:");
Scanner sc=new Scanner(System.in);
int year=Integer.parseInt(sc.nextLine());
Calendar c=Calendar.getInstance();
c.set(year,3,1);//将日期设置为这年的3月1日
c.add(Calendar.DAY_OF_MONTH,-1);//日期往回走一天,如果为29天则是平年,否则为闰年
if(c.get(Calendar.DAY_OF_MONTH)==29){
System.out.println(year+"是平年");
}else {
System.out.println(year+"是闰年");
}
}
}