个人技术分享

人长大之后就在频繁地离别,相聚反而时日无多

                                                                —— 24.6.17

一、正则表达式的概念及演示

1.概述

        正则表达式是一个具有特殊规则的字符串

2.作用:校验  

3.String中有一个校验正则的方法:

        boolean matches(String regex) —— 校验字符串是否符合指定的regex的规则

4.案例:

        校验QQ号(不能以0开头,必须都是数字,必须是5-15位的)

package S104Regex;

import java.util.Scanner;

public class Demo293Regex {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String data = sc.next();
        boolean b = method01(data);
        System.out.println("result: " + b);

        String data1 = sc.next();
        boolean c = method02(data1);
        System.out.println("result: " + c);
    }

    private static boolean method02(String data) {
        // 1-9数字开头、都是数字0-9,出现4到14次
        boolean result = data.matches("[1-9][0-9]{4,14}");
        return result;
    }

    private static boolean method01(String data) {
        // 不能是0开头的 startsWith开头第一个元素
        if (data.startsWith("0")){
            return false;
        }

        // 必须都是数字
        char[] chars = data.toCharArray();
        for (char aChar : chars) {
            if(aChar<'0' || aChar>'9'){
                return false;
            }
        }
        // 必须是5-15位
        if(data.length()<5 || data.length()>15){
            return false;
        }
        // 以上条件都不满足就返回true
        return true;
    }
}

二、正则表达式的具体使用

1.正则表达式—字符类

        java.util.regex.Pattern:正则表达式的编译表示形式。

        正则表达式-字符类:[]表示一个区间,范围可以自己定义

        语法示例:

                1.[abc]:代表a或者b,或者c字符中的一个。        

                2.[^abc]:代表除a,b,c以外的任何字符。

                3.[a-z]:代表a-z的所有小写字符中的一个。

                4.[A-Z]:代表A-Z的所有大写字符中的一个。

                5.[0-9]:代表0-9之间的某一个数字字符

                6.[a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符

                7.[a-dm-p]:a到d或m到 p之间的任意一个字符

        示例:

import java.util.Scanner;

public class Demo294Regex02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String next = sc.next();
        method01(next);
    }

    // 字符类
    private static void method01(String str){
        // 1.验证字符串是否以h开头,d结尾,中间是aeiou的某一个字符
        boolean matches = str.matches("[h][aeiou][d]");
        System.out.println("result = " + matches);

        // 2.验证字符串是否以h开头,d结尾,中间不是aeiou的某个字符
        boolean matches2 = str.matches("[h][^aeiou][d]");
        System.out.println("result2 = " + matches2);

        // 3.验证字符串是否是开头a-z的任意一个小写字母,后面跟ad
        boolean matches3 = str.matches("[a-z][a][d]");
        System.out.println("result3 = " + matches3);
    }
}

2.正则表达式—逻辑运算符

import java.util.Scanner;

public class Demo295RegexLogic {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String next = sc.next();
        method01(next);
    }

    private static void method01(String str) {
        // 1.要求字符串是小写字母开头,并且字符不能以【aeiou】开头,后面跟ad
        boolean result1 = str.matches("[[a-z]&&[^aeiou]][a][d]");
        System.out.println("result1 = " + result1);

        // 2.要求字符是aeiou的某一个字符开头,后面跟ad
        boolean result2 = str.matches("[aeiou][a][d]");
        System.out.println("result2 = " + result2);
    }
}

3.正则表达式—预定义字符

        语法示例:

                1.”.”:匹配任何字符。(重点) 不能加[]

                2."\\d":任何数字[0-9]的简写;(重点)

                3."\\D":任何非数字[^0-9]的简写;

                4.“\\s”空白字符:[ \t\n\x0B\f\r ]的简写

                5."\\S": 非空白字符:[^\s] 的简写

                6."\\w":单词字符:[a-zA-Z_0-9]的简写(重点)

                7."\\W":非单词字符:[^\w]

示例

import java.util.Scanner;

public class Demo296RegexPreDefine {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String next = sc.next();
        method01(next);
    }

    private static void method01(String next) {
        // 1.验证字符串是否为3位数字的
        boolean matches1 = next.matches("[0-9][0-9][0-9]");
        System.out.println("matches11 " + matches1);

        boolean matches2 = next.matches("\\d\\d\\d");
        System.out.println("matches12 " + matches2);

        // 2.验证手机号:1开头,第二位是3、5、8,剩下的都是0-9的数字
        boolean matches3 = "15546565656".matches("[1][358]\\d\\d\\d\\d\\d\\d\\d\\d\\d");
        System.out.println("matches13 " + matches3);
    }
}

4.正则表达式—数量词

        语法示例:x代表字符

        1.X?:x出现的数量为 0次或1次

        2.x*:x出现的数量为 0次到多次 任意次        

        3.X+:x出现的数量为 1次或多次 x>=1次

        4.x{n} :x出现的数量为 恰好n次 x=n次

        5.x{n}:x出现的数量为 至少n次x>=n次 x{3,}

        6.x{n,m}: x出现的数量为 n到m次(n和m都是包含的)        n=<X<=m

        示例

import java.util.Scanner;

public class Demo297RegexCount {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String next = sc.next();
        method01(next);
    }
    private static void method01(String str){
        // 验证手机号:1开头,第二位是3、5、8,剩下的都是0-9的数字
        boolean matches = str.matches("[1][358]\\d{9}");
        System.out.println("matches= "+matches);
    }
}

5.正则表达式—分组括号

        正则表达式-分组括号()        (abc)

import java.util.Scanner;

public class Demo298Regexkuohao {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String next = sc.next();
        method01(next);
    }
    private static void method01(String next) {
        // 校验abc可以出现任意次
        boolean matches = next.matches("(abc)*");
        System.out.println("Matches: " + matches);
    }
}

三、String中和正则相关的方法

boolean matches(string regex)        判断字符串是否匹配给定的正则表达式。

String[] split(String regex)         根据给定正则表达式的匹配拆分此字符串。

String replaceAll(string regex,String replacement)        把满足正则表达式的字符串,替换为新的字符

import java.util.Arrays;

public class Demo299RegexString {
    public static void main(String[] args) {
        String next = "abc hahah  hehe   hdjalkms";
        method01(next);
        String next2 = next.replaceAll(" +", "h");
        
        //String replaceAll(string regex,String replacement)  把满足正则表达式的字符串,替换为新的字符
        method01(next2);
    }

    private static void method01(String next) {
        // String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
        String[] arr1 = next.split(" +");
        System.out.println(Arrays.toString(arr1));
    }
}