(十四)java正则表达式、枚举

1. System和Runtime类

1.1 System类

System类代表系统,系统级的很多属性和成员方法都放置在该类的内部,该类位于java.lang包

  1. (System.in) 输入流(键盘输入)
  2. System.out.println()标准输出流
  3. System.err.ptintln()标准错误输出流
  4. 其它:见代码
 @Test
    public void test3() {
        String javaVersion = System.getProperty("java.version");
        System.out.println("java的version = " + javaVersion);
        String javaHome = System.getProperty("java.Home");
        System.out.println("java的Home = " + javaHome);

        String osName = System.getProperty("os.Name");
        System.out.println("osName = " + osName);
        String osVersion = System.getProperty("os.version");
        System.out.println("os的version:" + osVersion);

        String userName = System.getProperty("user.name");
        System.out.println("user的name:" + userName);
        String userHome = System.getProperty("user.home");
        System.out.println("user的home:" + userHome);
        String userDir = System.getProperty("user.dir");
        System.out.println("user的dir:" + userDir);
    }

1.2Runtime类

public void addShutdownHook(Thread hook)捕获JVM推出时间
用法:

public class test3 {
    public static void main(String[] args) throws InterruptedException {
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("捕获JVM退出,释放资源");//在jvm关闭前,要做一些事
            }
        }));
        System.out.println("abc");
        Thread.sleep(2000);
        try{
            int i = 1 /0;
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("abc");
        System.out.println("-------------------");
    }
}
运行结果
abc
123
abc
123
java.lang.ArithmeticException: / by zero
	at test1.test3.main(test3.java:21)
abc
123
abc
123
abc
-------------------
捕获JVM退出,释放资源

2. BigInteger

Integer类作为int的包装类,能存储的最大整数为2的31次方-1,long类也是有限的。
BigInteger可以表示不可变的任意精度的整数,具体用法如下

 public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        Integer i1 =2147483647;
//        Integer i2 =2147483648; 超过了integer类的最大限度

        BigInteger i3 = new BigInteger("15");
        System.out.println(i3);
        BigInteger i4 = new BigInteger("5");

        BigInteger i5 = i3.add(i4);
        System.out.println(i5);

        BigInteger[] arrs = i3.divideAndRemainder(new BigInteger("7"));//将除数和余数存放在数组中
        System.out.println(Arrays.toString(arrs));
    }

3. 正则表达式

正则表达式,又称为规则表达式,在代码中常简写为regex
是一种文本模式,包括普通字符特殊字符,是计算机科学的一个概念,正则表达式使用单个字符串来描写、匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本

在线工具

3.1 String类中的正则表达式

public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入qq号");
            String s1 = scanner.next();
            System.out.println(s1.matches("[0-9]{6,12}") == true);
        }
    }
运行结果
请输入qq号
2941588509
true
请输入qq号

        @Test
        public void test2() {
            String s = "Java 是由 Sun Microsystems 公司于 19955 月推出的高级程序设计语言Java 可运行于多个平台,
            如 windows,Mac OS 及其他多种 UNIX 版本的系统";
            s = s.replaceAll("[a-zA-Z]+","hello");
            s = s.replaceAll("\\d+","world");
            System.out.println(s);
        }
运行结果
hello 是由 hello hello 公司于 world 年 world 月推出的高级程序设计语言hello 可运行于多个平台,
如 hello,hello hello 及其他多种 hello 版本的系统
        
        @Test
    public void test4(){
            String s1 = "aaa,bbb,123,456,hello,word";
            String[] arr = s1.split(",");
            System.out.println(Arrays.toString(arr));
        }
运行结果
[aaa, bbb, 123, 456, hello, word]        

    @Test
    public void test5(){
        String s1 = "hello12333world4567welcome34to4beijing";
        String[] arr = s1.split("\\d+");
        System.out.println(Arrays.toString(arr));
    }
运行结果
[hello, world, welcome, to, beijing]

3.2 正则表达式常用类

3.2.1 Pattern类

Pattern对象是一个正则表达式的编译表示,Pattern类没有公共构造方法,要创建一个Pattern对象,你必须首先调用其公共静态编译方法,他返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。

  • compile() 通过正则得到一个Pattern
  • matchers()方便正则表达式只是用一次,进行匹配
  • matcher()产生Matcher对象,多次正则匹配推荐使用

3.2.2 Matcher类

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。于Pattern类一样,Matcher也没有公共的构造方法,需要使用Pattern对象的matcher方法获得一个Matcher类的对象
常用的方法

  • public int start() 返回以前匹配的初始索引
  • public int start(int group) 返回以前匹配的初始索引,给定组所捕获的子序列的初始索引
  • public int end()返回最后匹配字符之后的偏移量。
  • public int end(int group)返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
  • public boolean find()尝试查找与该模式匹配的输入序列的下一个子序列。
  • public boolean find(int start)重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
  • public boolean matches()尝试将整个区域与模式匹配。
  • group()返回上一个匹配项匹配的输入子序列。
  • group(int group)返回上一个匹配操作期间给定组捕获的输入子序列。
  • public Matcher appendReplacement(StringBuffer sb, String replacement)实现非终端添加和替换步骤。
  • public StringBuffer appendTail(StringBuffer sb)实现终端添加和替换步骤。
public class Test2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Pattern pattern = Pattern.compile("\\d{5,12}");//正则的编译对象
        while (true) {
            System.out.println("请输入qq号");
            String s1 = scanner.next();
            Matcher matcher = pattern.matcher(s1);
            System.out.println(matcher.matches());//全部匹配
        }
    }
请输入qq号
2941588509
true
请输入qq号

    @Test
    public void test1() {
        //只匹配一次可以的使用matches
        System.out.println(Pattern.matches("\\d{5,12}", "12345678"));//全都匹配

        //正则式多次匹配
        Pattern pattern = Pattern.compile("\\d{5,12}");//速度较快
        pattern.matcher("12345678").matches();
    }

    @Test
    public void test3() {
        Pattern pattern = Pattern.compile("\\d{5,12}");
        Matcher m = pattern.matcher("12345a3232323");
        System.out.println(m.matches());//需要全部匹配成功才是正确
//        m.reset();

        Matcher m1 = pattern.matcher("12345a3434343abc676776"); //非全部匹配
        while (m1.find()) {//查找匹配,如果匹配成功返回true
            String target = m1.group();//得到上一次匹配成功的子序列
            System.out.println(target + ":" + m1.start() + "-" + m1.end());
        }
    }
false
12345:0-5
3434343:6-13
676776:16-22

    @Test
    public void test5() {
        String content = "Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。\n"
                + "Java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。\n"
                + "本教程通过简单的实例将让大家更好的了解 Java 编程语言。\n"
                + "移动操作系统 Android 大部分的代码采用 Java 编程语言编程。";

        Pattern pattern = Pattern.compile("([a-zA-Z]+) | (\\d+)");
        Matcher matcher = pattern.matcher(content);

        while(matcher.find()){
            String str = matcher.group(0);//0:全部的正则捕获组,1:的一个小括号的正则子组里的第一个
            System.out.println(str);
        }
    }
Java 
Sun 
Microsystems 
 1995
 5
Java 
Mac 
OS 
UNIX 
Java 
Android 
Java 

    @Test
    public void test6(){
        String content = "Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。\n"
                + "Java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。\n"
                + "本教程通过简单的实例将让大家更好的了解 Java 编程语言。\n"
                + "移动操作系统 Android 大部分的代码采用 Java 编程语言编程。";

        Pattern pattern = Pattern.compile("Java");
        Matcher matcher = pattern.matcher(content);
        StringBuffer sb = new StringBuffer();

        while (matcher.find()){
            matcher.appendReplacement(sb,"java");
            System.out.println("sb:" + sb);
            System.out.println("====分隔符======");
        }
        matcher.appendTail(sb);
        System.out.println("sb:" + sb);
    }
sb:java
====分隔符======
sb:java 是由 Sun Microsystems 公司于 19955 月推出的高级程序设计语言。
java
====分隔符======
sb:java 是由 Sun Microsystems 公司于 19955 月推出的高级程序设计语言。
java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。
本教程通过简单的实例将让大家更好的了解 java
====分隔符======
sb:java 是由 Sun Microsystems 公司于 19955 月推出的高级程序设计语言。
java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。
本教程通过简单的实例将让大家更好的了解 java 编程语言。
移动操作系统 Android 大部分的代码采用 java
====分隔符======
sb:java 是由 Sun Microsystems 公司于 19955 月推出的高级程序设计语言。
java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。
本教程通过简单的实例将让大家更好的了解 java 编程语言。
移动操作系统 Android 大部分的代码采用 java 编程语言编程。

3.3 表达式语法

3.3.1 转义字符

转义号:\\一般用两个
需要用到转义号的有:. * + ( )$ / \ ? [ ] ^ { }

3.3.2 支持的字符

特殊字符

$	匹配一行的结尾。要匹配 $ 字符本身,请使用\$
^	匹配一行的开头。要匹配 ^ 字符本身,请使用\^
()	标记子表达式的开始和结束位置。要匹配这些字符,请使用\(和\)
[]	用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用\[和\]
{}	用于标记前面子表达式的出现频度。要匹配这些字符,请使用\{和\}
*	指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用\*
+	指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用\+
?	指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用\?
.	匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用\.
\	用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\\
|	指定两项之间任选一项。如果要匹配丨字符本身,请使用\

预定义字符

.	可以匹配任何字符
\d	匹配 0~9 的所有数字
\D	匹配非数字
\s	匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
\S	匹配所有的非空白字符
\w	匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_
\W	匹配所有的非单词字符

3.3.3 捕获组

正则表达式的整体为0,然后从左侧开始数,第一个括号为1,的二个括号为2,然后再看括号里有没有小括号。
对于字符串 2017-04-25 表达式为:(\d{4})-((\d{2})-(\d{2}))
有四个括号,编号如下

编号	捕获组						匹配
0		(\d{4})-((\d{2})-(\d{2}))	2017-04-25
1		(\d{4})                  	2017
2		((\d{2})-(\d{2}))       	04-25
3		(\d{2})						04
4		(\d{2})						25

4. 枚举

应用场景:类的对象只有有限个,确定的。枚举可以看成一个如:

  • 星期
  • 性别
  • 季节
  • 支付方式
  • 就职状态
  • 订单状态
  • 线程状态:新建 就绪 运行 阻塞 死亡

Enum类的主要方法:

  • values() 返回枚举对象类的数组,可很方便地遍历所有枚举值
  • valueOf(String str)可以把一个字符串转为对应发枚举类对象,要求字符串必须是枚举类对象的名字。
  • toString()返回当前枚举类对象常量的名称
public class Test2 {
    public static void main(String[] args) {
        OrderState[] orderState = OrderState.values();
        for (int i = 0; i < orderState.length; i++) {
//            System.out.println( orderState[i].getValue()   );
            System.out.println( orderState[i]  +"  状态编号:" + orderState[i].getStateID() +  "  内容为:" + orderState[i].getValue());
        }
    }
    enum OrderState {//订单状态
        NON_PAYMENT(1, "未付款"),  //  等价于  static OrderState NON_PAYMENT = new OrderState(1,"未付款")
        PAID(2, "已付款"),
        DELIVERED(3, "已发货"),
        RETURN(4, "退货"),
        CHECKED(5, "已确认"),
        FULFILLED(6, "已配货");

        private String value;
        private int stateID;

        OrderState() {
        }
        OrderState(int stateID, String value) {
            this.value = value;
            this.stateID = stateID;
        }
        public String getValue() {
            return value;
        }
        public int getStateID() {
            return stateID;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值