Java 的正则表达式Regex

  • java.util.regex.Pattern 有正则表达示例
/*
[abc]	a, b, or c (simple class)   abc中任意一个字符
[^abc]	Any character except a, b, or c (negation)  非abc的一个字符
[a-zA-Z]	a through z or A through Z, inclusive (range)  匹配a-z A-Z 大小写字符
[a-d[m-p]]	a through d, or m through p: [a-dm-p] (union)  匹配a-d 和 匹配 m-p 字符, 匹配则true
[a-z&&[def]]	d, e, or f (intersection)  匹配def 与 a-z的并集是 def
[a-z&&[^bc]]	a through z, except for b and c: [ad-z] (subtraction), 非bc 和 a-z取并集(匹配a d-z字符)
[a-z&&[^m-p]]	a through z, and not m through p: [a-lq-z](subtraction), 非m-p字符与a-z取并集, 并集是a-l和q-z
 */

private static void Demo7() {
    String regex = "[a-z&&[^m-p]]";
    System.out.println("a".matches(regex));
    System.out.println("n".matches(regex));
}

private static void Demo6() {
    String regex = "[a-z&&[^bc]]";
    System.out.println("a".matches(regex));
    System.out.println("b".matches(regex));
}

private static void Demo5() {
    String regex = "[a-z&&[def]]";
    System.out.println("m".matches(regex));
    System.out.println("a".matches(regex));
    System.out.println("d".matches(regex));
}

private static void Demo4() {
    String regex = "[a-d[x-z]]";
    System.out.println("m".matches(regex));
    System.out.println("a".matches(regex));
    System.out.println("x".matches(regex));
}

private static void Demo3() {
    String regex = "[a-zA-Z]";
    System.out.println("a".matches(regex));
    System.out.println("*".matches(regex));
}

private static void Demo2() {
    String regex = "[^abc]";
    System.out.println("a".matches(regex));
    System.out.println("d".matches(regex));
    System.out.println("10".matches(regex));
}

private static void Demo1() {
    String regex = "[abc]";
    System.out.println("a".matches(regex));
    System.out.println("d".matches(regex));
}

正则预先定义的字符

public class Demo4_Regex {
    public static void main(String[] args) {
       /*
         .	Any character (may or may not match line terminators)  匹配任何字符
        \d	A digit: [0-9]    0-9字符, 其他字符则false
        \D	A non-digit: [^0-9]  非 0-9 字符, 0-9字符则false
        \h	A horizontal whitespace character: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]  水平空白字符
        \H	A non-horizontal whitespace character: [^\h]   非水平空白字符
        \s	A whitespace character: [ \t\n\x0B\f\r]  空白字符
        \S	A non-whitespace character: [^\s]  非空白字符
        \v	A vertical whitespace character: [\n\x0B\f\r\x85\u2028\u2029]  垂直空白字符
        \V	A non-vertical whitespace character: [^\v]   非垂直空白字符
        \w	A word character: [a-zA-Z_0-9] 大小写 数字 下划线
        \W	A non-word character: [^\w]  除大小写 数字 下划线 以外字符
        */
    }

    private static void Demo5() {
        // 字符 \w a-zA-Z0-9_ \W, 除去a-zA-Z0-9_的字符
        String regex = "\\w";
        System.out.println("s".matches(regex));
        System.out.println("_".matches(regex));
        System.out.println("0".matches(regex));
        System.out.println("&".matches(regex));

        String regex2 = "\\W";
        System.out.println("s".matches(regex2));
        System.out.println("_".matches(regex2));
        System.out.println("0".matches(regex2));
        System.out.println("&".matches(regex2));
    }

    private static void Demo4() {
        String regex = "\\v";
        System.out.println(" ".matches(regex));
        System.out.println("\t".matches(regex));
        System.out.println("\n".matches(regex));
        System.out.println("a".matches(regex));

        String regex2 = "\\V";
        System.out.println(" ".matches(regex2));
        System.out.println("\t".matches(regex2));
        System.out.println("\n".matches(regex2));
        System.out.println("a".matches(regex2));
    }

    private static void Demo3() {
        String regex = "\\s";
        System.out.println(" ".matches(regex));
        System.out.println("\t".matches(regex));
        System.out.println("\n".matches(regex));
        System.out.println("a".matches(regex));

        String regex2 = "\\S";
        System.out.println(" ".matches(regex2));
        System.out.println("\t".matches(regex2));
        System.out.println("\n".matches(regex2));
        System.out.println("a".matches(regex2));
    }

    private static void Demo2() {
        String regex = "\\h";
        String regex2 = "\\H";
        System.out.println("a".matches(regex));
        System.out.println(" ".matches(regex));
        System.out.println("\t".matches(regex));
        System.out.println("\n".matches(regex));

        System.out.println("a".matches(regex2));
        System.out.println(" ".matches(regex2));
        System.out.println("\t".matches(regex2));
        System.out.println("\n".matches(regex2));
    }


    private static void Demo1() {
        String regex = "\\d";
        System.out.println("a".matches(regex));
        System.out.println("9".matches(regex));

        String regex2 = "\\D";
        System.out.println("a".matches(regex2));
        System.out.println("9".matches(regex2));
    }
    private static void Demo() {
        String regex = ".";
        System.out.println("a".matches(regex));
        System.out.println("%".matches(regex));
        System.out.println("9".matches(regex));
    }
}

正则匹配 出现次数

public class Demo5_Regex {
    public static void main(String[] args) {
        /*
        X?	X, once or not at all  X出现一次或一次也没有, 但是不能出现其他内容
        X*	X, zero or more times  X出现0次或>0次, 但是不能出现其它内容
        X+	X, one or more times   X出现1次或>1次, 但是不能出现其它内容
        X{n}	X, exactly n times X准确出现n次, 不多不少, 但是不能出现其它内容
        X{n,}	X, at least n times X出现次数至少n次, 但是不能出现其它内容
        X{n,m}	X, at least n but not more than m times  X出现次数 至少n次, 不超过m次, 记[n, m)次
        */
    }

    private static void Demo6() {
        String regex = "[abc]{2,4}";
        System.out.println("a".matches(regex));
        System.out.println("ab".matches(regex));
        System.out.println("aba".matches(regex));
        System.out.println("abca".matches(regex));
        System.out.println("abcabc".matches(regex));
        System.out.println(" ".matches(regex));
    }

    private static void Demo5() {
        String regex = "[abc]{5,}";
        System.out.println("abca".matches(regex));
        System.out.println("abcab".matches(regex));
        System.out.println("abcabc".matches(regex));
        System.out.println("dkfjkf".matches(regex));
    }

    private static void Demo4() {
        String regex = "[abc]{5}";
        System.out.println("abca".matches(regex));
        System.out.println("abccc".matches(regex));
        System.out.println("abcabc".matches(regex));
        System.out.println("abccd".matches(regex));
        System.out.println("d".matches(regex));
        System.out.println(" ".matches(regex));
    }

    private static void Demo3() {
        String regex = "[abc]+";
        System.out.println("a".matches(regex));
        System.out.println("abc".matches(regex));
        System.out.println("abcabccc".matches(regex));
        System.out.println("abcd".matches(regex));
        System.out.println("".matches(regex));
        System.out.println("d".matches(regex));
    }

    private static void Demo2() {
        String regex = "[abc]*";
        System.out.println("".matches(regex));
        System.out.println("a".matches(regex));
        System.out.println("b".matches(regex));
        System.out.println("bb".matches(regex));
        System.out.println("abc".matches(regex));
        System.out.println(" ".matches(regex));
        System.out.println("s".matches(regex));
    }

    private static void Demo1() {
        String regex = "[abc]?";
        System.out.println("".matches(regex));
        System.out.println("a".matches(regex));
        System.out.println("b".matches(regex));
        System.out.println(" ".matches(regex));
        System.out.println("bb".matches(regex));
        System.out.println("s".matches(regex));
    }
}

String 中的 split 方法

  • String[] split(String regex) 匹配正则分隔成字符串数组
// 空格或问号出现1次或以上, 分隔
public class Demo6_Regex {
    public static void main(String[] args) {
        String str = "What is a youth?";
        String regex = "[\\s\\?]+";
        String [] strArray = str.split(regex);
        for(String s:strArray){
            System.out.println(s);
        }
    }
}

练习 字符串的数组, 经过排序后, 再转换成字符串

  1. 字符串, 分隔成字符串组
  2. 字符串组 转换为 数组
  3. 数组排序
  4. 数组重新转换为字符串
public class Demo1_Split {
    public static void main(String[] args) {
        String str = "1 10 2 30 100 40";
        String regex = "[\\s]+";
        String [] strArray = str.split(regex);
        int [] a = new int[strArray.length];
        for(int i=0;i<strArray.length;i++){
            a[i]  =  Integer.parseInt(strArray[i]);
        }
        StringBuffer sb = new StringBuffer();
        Arrays.sort(a);
        if(a.length <1){
            sb = sb.append("{}");
        } else{
            sb.append("{");
            for (int i=0;i<a.length;i++){
                if(i == a.length-1){
                    sb.append(a[i] + "}");
                    break;
                }
                sb.append(a[i] + " ");
            }
        }
        System.out.println(sb);
    }
}

正则匹配, 替换字符

public class Demo2_Replace {
    public static void main(String[] args) {
        String str = "What2is2a233youth?";
        String regex = "[\\d]";
        String res = str.replaceAll(regex,"");
        System.out.println(res);

        String regex2 = "[\\d]";
        String res2 = str.replaceAll(regex2," ");
        System.out.println(res2);

        String regex3 = "[\\d]+";
        String res3 = str.replaceAll(regex3," ");
        System.out.println(res3);
    }
}

正则匹配, 组 捕获

((A)(B(C))) , 组是以左括号为一组, 所有共有 4 组

  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)

正则匹配, 组的练习

public class Demo4_Replace {
    public static void main(String[] args) {
//        Demo1();
        String str = "我...我...我...我....想想........学编...编...程....程...程程..";
        String regex = "[\\.]+";
        String str2 = str.replaceAll(regex, "");
        System.out.println(str2);

        String regex2 = "(.)\\1+";
        String str3 = str2.replaceAll(regex2, "$1");
        System.out.println(str3);
    }

    private static void Demo1() {
        String str = "abchhhhkdjflllljkklqqqq";
        String regex = "(.)\\1+";
        String[] strArray = str.split(regex);
        for(String s:strArray){
            System.out.println(s);
        }
    }
}

正则匹配, Pattern 和 Matcher, 练习获取手机号

  • 考虑手机号第2位一直在增加, 以1开头11位即认为正确手机号
public static void main(String[] args) {
    String str = "我用过的手机号12310001000, 上一个手机号是12310001001, 目前在用的12310001002";
    String regex = "[1][\\d]{10}";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(str);
    while (m.find()){
        System.out.println(m.group());
    }
}

Math 类

public class Demo1_Math {
    public static void main(String[] args) {
        System.out.println(Math.PI);
        System.out.println(Math.abs(-120));
        // 向上取整 (0,1]
        System.out.println(Math.ceil(23.8));
        System.out.println(Math.ceil(23.1));
        // 向下取整 [0,1)
        System.out.println(Math.floor(23.8));
        System.out.println(Math.floor(24.0));
        System.out.println(Math.max(23,30));
        System.out.println(Math.pow(3,3));
        // 包含 [0.0,1.0)
        System.out.println(Math.random());
        System.out.println(Math.sqrt(2));
    }
}

Random 随机数

  • Random 是伪随机数, 生成的随机数由随机因子决定的
  • nextInt(100) 可以生成[0,100) 的随机整数
import java.util.Random;
public class Demo1_Random {
    public static void main(String[] args) {
        Random r = new Random();
        for(int i=0;i<10;i++){
            int a = r.nextInt(100);
            System.out.println(a);
        }

        Random r2 = new Random(1000);
        int a1 = r2.nextInt();
        int a2 = r2.nextInt();
        System.out.println(a1);
        System.out.println(a2);
        // 执行多少次 a1 和 a2 固定
    }
}

System 类

  • System.in 输入流, Scanner 录收键盘
  • System.out 输出控制台
  • System.gc() 垃圾回收
  • System.currentTimeMillis() 到1971年的毫秒, 2次时间差就能知道程序运行时间
  • exit() 退出 0 正常终止, 非0 异常终止
  • arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 数组复制, int str 对象等都可复制
public class Demo1_System {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println("jkdjf");
        System.out.println(System.currentTimeMillis());
        long start = System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
            System.out.print("");
            StringBuffer sf = new StringBuffer();
        }
        long end = System.currentTimeMillis();

        System.out.println(end-start);
        for(int i=0;i<10;i++){
            new Test();
            System.gc();
        }
        int [] src = {1, 2, 3, 4, 5};
        int [] dest = new int[8];
        System.arraycopy(src, 0, dest,0,src.length);
        for(int i:dest){
            System.out.println(i);
        }
    }
}
class Test{
    Test(){}
    @Override
    public void finalize(){
        System.out.println("垃圾回收");
    }
}

BigInteger 类

import java.math.BigInteger;

public class Demo1_BigInteger {
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("100");
        BigInteger bi2 = new BigInteger("3");
        System.out.println(bi1.add(bi2));
        System.out.println(bi1.subtract(bi2));
        System.out.println(bi1.multiply(bi2));
        System.out.println(bi1.divide(bi2));
        BigInteger [] bArray;
        bArray = bi1.divideAndRemainder(bi2);
        for(BigInteger b:bArray){
            System.out.println(b);
        }
    }
}

BigDecimal, 金融运算使用

  • static BigDecimal valueOf(double val) 由double 转为 BigDecimal
  • 构造函数时BigDecimal(String val), string 转为 BigDecimal
public class Demo1_BigDecimal {
    public static void main(String[] args) {

        System.out.println(2.0 - 1.1 );

        BigDecimal bd1 = new BigDecimal(2.0);
        BigDecimal bd2 = new BigDecimal(1.1);
        System.out.println(bd1.subtract(bd2));

        BigDecimal bd3 = new BigDecimal("2.0");
        BigDecimal bd4 = new BigDecimal("1.1");
        System.out.println(bd3.subtract(bd4));

        BigDecimal bd5 = BigDecimal.valueOf(2.0);
        BigDecimal bd6 = BigDecimal.valueOf(1.1);
        System.out.println(bd5.subtract(bd6));
    }
}

Date 类

  • System.currentTimeMillis date.getTime() 都是与GMT 1970 01 01 00:00:00 的毫秒值
public class Demo1_Date {
    public static void main(String[] args) {
//        Demo1();
        Date date = new Date();
        System.out.println(date.getTime());
        System.out.println(System.currentTimeMillis());

        date.setTime(2000);
        System.out.println(date);
    }

    private static void Demo1() {
        Date date = new Date();
        System.out.println(date);
        Date date2 = new Date(0);
        System.out.println(date2);
    }
}

SimpleDateFormat

  • Date 特定格式输出
  • 字符串转为Date
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo1_DateFormat {
    public static void main(String[] args) throws ParseException {
//        Demo1();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
        String strDate = "2021年08月18日 23:44:59 星期三";
        Date date = sdf.parse(strDate);
        System.out.println(date);
    }

    private static void Demo1() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
        System.out.println(sdf.format(date));
    }
}

SimpleDateFormat 练习, 从生日到现在多少天了

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo2_DateFormat {
    public static void main(String[] args) throws ParseException {
        String strDate = "1991-01-01";
        Date date = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date birthday = sdf.parse(strDate);

        long days = date.getTime() - birthday.getTime();

        System.out.println(days/1000/3600/24);
    }
}

Calendar 类

  • Calendar 的获取月份时的0对应1月, 7 对应8月
  • Calendar 获取的1对应的是 星期天, DAY_OF_WEEK
  • add(int field, int amount) 给年月日时分秒增减
  • set(int field, int value) 给年月日时分秒设置数值
  • set(int year, int month, int date) 设置年月日
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Demo1_Calendar {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        String month = setTwoNu(cal.get(Calendar.MARCH) + 1);
        System.out.println(month);
        String week = getWeek(cal.get(Calendar.DAY_OF_WEEK));
        System.out.println(week);
        System.out.println(cal.get(Calendar.DAY_OF_MONTH));
        System.out.println(cal.getTime());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
        System.out.println(sdf.format(cal.getTime()));
    }
    public static String getWeek(int week){
        String [] strArray = {"", "星期日", "星期一","星期二","星期三","星期四","星期五","星期六"};
        return strArray[week];
    }
    public static String setTwoNu(int nu){
        String s = String.valueOf(nu);
        if( nu <10 ){
            s = "0" + nu;
        }
        return s;
    }
}
import java.util.Calendar;

public class Demo2_Calendar {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR, 10);
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH));

        calendar.set(Calendar.MONTH, 10);
        System.out.println(calendar.get(Calendar.MONTH));

        calendar.set(2021,9,01);
        System.out.println(calendar.get(Calendar.YEAR) +""+ (calendar.get(Calendar.MONTH)+1) +"" +calendar.get(Calendar.DAY_OF_MONTH));
    }
}

Calendar 平年 润年

import java.util.Calendar;

public class Demo3_Calendar {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        int year = 2020;
        calendar.set(year,2,1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        if( 29 == calendar.get(Calendar.DAY_OF_MONTH)){
            System.out.println( year + "年是润年");
        } else {
            System.out.println( year + "年是平年");
        }
    }
}