JavaSE基础——(14)正则表达式与常用工具类

目录

一、正则表达式

1.1正则表达式的概述

1.2字符类

1.3预定义字符类

1.4数量词

1.5给定字符串数字排序练习

1.6正则表达式的替换功能

1.7正则表达式的分组功能

1.8Pattern和Matcher的区别

1.9正则表达式的获取功能

二、Math类

三、Random类

四、System类

五、BigInteger类

六、BigDecimal类

七、Date类

八、SimpleDateFormat类

九、Calendar类

9.1Calendar类的概述

9.2Calendar类的add()和set()方法

9.3平年闰年判断


一、正则表达式

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)))中,存在四个组,

  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (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+"是闰年");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/112604602