Java正则表达式

1.正则表达式是什么?

正则表达式可以用一些规定的字符来指定规则,并用来校验数据格式的合法性。

Java正则表达式_第1张图片

 比如:规定用户名只能用英文名,密码规定只能6位,手机号是否合法,就需要用正则表达式来校验。

2.正则表达式初体验

需求:假如现在要求校验一个QQ号是否正确,6位及10位内,必须全部是数字。

    public static void main(String[] args) {
//        模拟用户输入QQ号
        String input01 = "952396051";
        System.out.println(checkQQ(input01));
        System.out.println(regexCheckQQ(input01));

        String input02 = "12345678901";
        System.out.println(checkQQ(input02));
        System.out.println(regexCheckQQ(input02));

        String input03 = "123qq321";
        System.out.println(checkQQ(input03));
        System.out.println(regexCheckQQ(input03));

        String input04 = null;
        System.out.println(checkQQ(input04));
        System.out.println(regexCheckQQ(input04));
    }

/*
用正则表达式校验qq是否合法的方法
return qq号合法返回true,否则返回false
 */
    public static boolean regexCheckQQ(String qq){
//        “\\d”:第一个“\”是转义的意思,相当于是告诉第二个"\"你就是一个杠
//        "\d":代表全数字:0-9
//        {6,10}:代表是6—10位之间

//        输入的qq号不能为null且全部是0-9之间的数字,6-10之间时,返回true,否之返回false
        return qq!=null&&qq.matches("\\d{6,10}");
    }

    /*
    检验qq是否合法的普通方法
    return QQ号合法返回true,否之返回false
     */
    public static boolean checkQQ(String qq){
//        当用户输入的qq为null或长度小于6或长度大于10时说明符合条件,返回false
        if (qq==null || qq.length()<6 || qq.length()>10){
            return false;
        }
//        遍历qq号,得到每位字符
        for (int i = 0; i < qq.length(); i++) {
            char ch = qq.charAt(i);
//            当得到的字符不是数字说明超出0-9的范围,返回false
            if (ch<'0'||ch>'9'){
                return false;
            }
        }
//        遍历结束,说明全部是数字,返回true
        return true;
    }

Java正则表达式_第2张图片

 3.正则表达式的匹配规则

1.字符类(默认匹配一个字符)

规则          	说明                                     
[abc]         	只能是a, b, 或c                          
[^abc]        	除了a, b, c之外的任何字符                
[a-zA-Z]      	a到z A到Z,包括(范围)——>大小写英文字母 
[a-d[m-p]]    	a到d,或m通过p:([a-dm-p]联合)
[a-z&&[def]]  	d, e, 或f(交集)
[a-z&&[^bc]]  	a到z,除了b和c:([ad-z]减法)
[a-z&&[^m-p]] 	a到z,除了m到p:([a-lq-z]减法)

2.预定义的字符类(默认匹配一个字符)

规则				说明
.				任何字符
\d				一个数字:[0-9]
\D				非数字:[^0-9]
\s				一个空白字符:[\t\n\x0B\f\r]
\S				非空白字符:[^\s]
\w				[a-zA-Z_0-9]英文、数字、下划线
\W				[^\w]一个非单词字符

3.贪婪的量词(配合匹配多个字符)

规则				说明
X?				X,一次或根本不
X*				X,零次或多次
X+				X,一次或多次
X{n}			X,正好n次
X{n,}			X,至少n次
X{n,m}			X,至少n次但不超过m次

4.字符串对象提供了匹配正则表达式规则的API

方法 说明
public boolean matches(String regex) 判断是否匹配正则表达式,匹配返回true,不匹配返回false

String类的matches()方法:判断是否与正则表达式匹配,是则返回true,否之返回false。

    public static void main(String[] args) {
//        以下都是默认匹配一个字符
//        只能是abc
        System.out.println("a".matches("[abc]"));
        System.out.println("d".matches("[abc]"));

//        不能出现abc
        System.out.println("a".matches("[^abc]"));
        System.out.println("d".matches("[^abc]"));

//        只能说一个数字
        System.out.println("a".matches("\\d"));
        System.out.println("10".matches("\\d"));
        System.out.println("1".matches("\\d"));

//        只能是一个大小写英文字母、数字、下划线
        System.out.println("a".matches("\\w"));
        System.out.println("A".matches("\\w"));
        System.out.println("_".matches("\\w"));
        System.out.println("3".matches("\\w"));
        System.out.println("abc".matches("\\w"));
        System.out.println("ABC".matches("\\w"));
        System.out.println("32".matches("\\w"));
        System.out.println("你".matches("\\w"));
        System.out.println("你好".matches("\\w"));

//        校验密码
//        必须是数字、字母、下划线至少8位
        String regex1 = "\\w{8,}";
        System.out.println("123Abc_kk".matches(regex1));
        System.out.println("123456".matches(regex1));
        System.out.println("你好世界12345".matches(regex1));

//        验证码:必须是数字、字符、必须是4位
        String regex2 = "[a-zA-Z0-9]{4}";
        System.out.println("ikun".matches(regex2));
        System.out.println("_heizi".matches(regex2));
    }

控制台输出结果:

Java正则表达式_第3张图片

4.正则表达式的常见案例 

案例一

请使用正则表达式完成如下需求:

请编写程序模拟用户输入手机号码、邮箱号码、验证码、是否正确,并给出提示,直到格式输入正确为止。

分析实现:

    public static void main(String[] args) {
//        键盘录入
        Scanner sc = new Scanner(System.in);
//        调用校验手机号码的方法
        checkPhone(sc);
//        调用校验邮箱号码的方法
        checkEmail(sc);
    }
    /*
    定义一个校验手机号的方法
     */
    public static void checkPhone(Scanner sc){
//        定义循环:电话格式有误时重新输入,直到格式输入正确为止
        while (true){
//            提示输入
            System.out.println("请输入您的电话号码:");
            String phone = sc.next();
/*            定义一个校验手机号的正则表达式:
*             1[3-9]代表前一位是1,后一位号码为3-9,
*             [0-9]{9}代表后面9位数字可都为0-9,加上前两位一共11位。
* */
            String regex = "1[3-9][0-9]{9}";
//            校验手机号码if判断,正确结束循环,错误继续循环
            if (phone.matches(regex)){
                System.out.println("格式正确");
                break;
            }else {
                System.out.println("格式不对哦");
            }
        }
    }
    /*
    定义校验邮箱的正则表达式

     */
    public static void checkEmail(Scanner sc){
//        定义循环:邮箱格式有误时重新输入,直到格式输入正确为止
        while (true){
//            提示输入
            System.out.println("请输入你的邮箱:");
            String email = sc.next();
/*
\\w:字符有一个或者多个构成(包括大小写数字下划线);
@:符号直接表示;
\\w{2,5}:表示这是一个2-5的字符串比如qq,163
\\:表示一个转义的符号,单个.表示任意字符
com:表示后缀
 */
            String regex = "\\w+@\\w{2,5}\\.com";
            if(email.matches(regex)){
                System.out.println("您输入的邮箱格式正确");
                break;
            }else {
                System.out.println("邮箱格式有误!");
            }
        }
    }

控制台输出结果:

Java正则表达式_第4张图片

案例二

需求:校验金额是否合法:

小数点后大于两位即为不合法,小数点后还有小数点也为不合法;

    public static void main(String[] args) {
//        调用校验金额方法
        checkMoney();
    }
    /*
    定义一个校验金额的方法
     */
    public static void checkMoney(){
//        创建键盘录入对象,用于输入数据
        Scanner sc = new Scanner(System.in);
//        定义循环,如果输入为非法金额继续循环
        while (true){
            System.out.println("请输入您需要校验的金额");
            String money = sc.next();
//          排除了非数字,中英文,空格,非正常数字(例如001),小数点大于2位
            String regex = "(^[1-9](\\d+)?(\\.\\d{1,2})?$)|(^0$)|(^\\d\\.\\d{1,2}$)";
            if (money.matches(regex)){
                System.out.println("此为合法金额...");
//                break;        //输入合法金额后结束循环
            }else {
                System.out.println("此为非法金额....");
            }
        }
    }

控制台输出结果:

Java正则表达式_第5张图片

 5.正则表达式在方法中的应用

方法 说明
public String replaceAll(String regex,String newStr) 按照正则表达式匹配的内容进行替换
public String[] split(String regex) 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组。
例子:
使用正则表达式匹配的内容进行分割字符串,返回一个字符串数组
    public static void main(String[] args) {
//        模拟得到一串混乱的数据,但是你想拿出这串数据里面的文字
        String name = "bxiauhkldsa集结ldjskadksl立刻ljk;132314|[.出发";
        /*
        \\w:代表数字、单词字符、下划线
        \\p{Punct}:代表标点符号:其中之一!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
        +:代表出现1次或多次
         */
        String[]strArrays = name.split("[\\w\\p{Punct}]+");
//        遍历分割后得到的文字
        for (int i = 0; i < strArrays.length; i++) {
            System.out.println(strArrays[i]);
        }
//        按照正则表达式匹配的内容进行替换,返回一个字符串结果
        String name2 = name.replaceAll("[\\w\\p{Punct}]+"," ");
        System.out.println(name2);
    }

控制台输出结果: 

Java正则表达式_第6张图片

6.正则表达式爬取信息 

例子:

模拟网上爬到的一段数据,从数据中爬取出电话,邮箱

    public static void main(String[] args) {
//        模拟从网上爬到一段信息数据
        String data = "我是胡图图我住在翻斗花园我电话是17777207426,找不到我可以联系我邮箱[email protected]"+
                "我是健康哥哥我现在在教小豆班我的电话是13709872663,可以直接联系我的邮箱[email protected]";
/*      定义一个爬取邮箱,电话的正则表达式:
邮箱规则:
\\w+:代表数字、单词字符出现一次或者多次
@:代表一个@
\\.\\:代表.后的数字,单词字符出现一次或多次
{2,3}:可以出现com|cn

手机号规则
第一位是1
第二位为3-9
\\d:9位数字
 */
        String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}|"+"(1[3-9]\\d{9})";
//        爬取规则编译成匹配对象
        Pattern pattern =Pattern.compile(regex);
//        得到一个信息匹配器对象
        Matcher matcher = pattern.matcher(data);
//        定义一个死循环,根据信息匹配器去爬取规则指定信息
        while (matcher.find()){
//            爬到一个指定信息就分成一组
            String result = matcher.group();
//            输出结果
            System.out.println(result);
        }
    }

控制台输出结果:

Java正则表达式_第7张图片

你可能感兴趣的:(Java基础,正则表达式)