正则表达式使用

正则表达式

概述:
正则表达式其实就是一个匹配规则,用来替换复杂的if结构判断,在Java中,我们经常需要验证一些字符串,是否符合规则, 例如:
在登录页面对于用户输入的密码需要进行一些限制,比如对于登录中SQL注入问题,帐号与密码不匹配却可以正常登录的问题
这里使用正则表达式对密码的字符格式进行限制,比如不能输入双引号以及单引号

//创建Scanner对象
Scanner sc = new Scanner(System.in);
//定义存储密码的字符串变量
String password = null;
//进入死循环
while (true) {
			//提示用户进行输入密码
            System.out.println("请输入密码:");
            //键盘录入
            password = sc.nextLine();
            //进行判断,不允许输入双引号以及单引号,限制的字符个数为输入的密码字符个数
            if (password.matches("[^'|^\"]{" + password.length() + "}")) {
            //如果输入的密码字符符合规则就结束死循环
                break;
            } else {
            	//若是用户输入的密码不符合要求则进行提示,让用户再次输入密码,直到输入密码符合要求为止
                System.out.println("对不起,你的密码中有特殊符号,请重新输入");
            }
        }

使用正则表达式的好处

eg:不使用正则表达式:下面的程序让用户输入一个手机号码,我们要验证:

  • 手机号码必须是11位长度
  • 手机号码首位必须为1
  • 手机号码第二位必须是3、5、7、8
  • 手机号码必须全部是数字
	/**
     * @author: Cartel
     * @date: 2021/4/13 17:15
     * @param number
     * @return boolean
     * */
    //定义方法进行判断输入的号码是否符合要求
    public static boolean checkNum(String number) {
        //- 手机号码必须是11位长度
        if (number.length() != 11) {
            return false;
        }

        //- 手机号码首位必须为1
        if (number.charAt(0) != '1' ) {
            return false;
        }

        //- 手机号码第二位必须是3、5、7、8
        char c = number.charAt(1);
        //进行判断是否符合要求
        if (!(c == '3' || c == '5' || c == '7' || c == '8')) {
            return false;
        }

        //- 手机号码必须全部是数字
        for (int i = 0; i < number.length(); i++) {
            char c1 = number.charAt(i);
            if (c1 < '0' || c1 > '9') {
                return false;
            }
        }

        //如果以上条件都不符合,则表示手机号是符合我们的条件的
        return true;
    }

对于以上的代码使用if语句进行判断需要进行多次判断,对于实现同样的功能我们使用正则表达式来实现

public static boolean checkNum(String number) {
        /**
         * 手机号码必须是11位长度
         * 正则表达式实现:{11}
         *
         * 手机号码首位必须为1
         * 正则表达式实现:[1]
         *
         * 手机号码第二位必须是3、5、7、8
         * 正则表达式实现:[][3,5,7,8]
         *
         * 手机号码必须全部是数字
         * [0-9]{11}
         *
         * []:表示一个字符位置
         * x{n}:表示恰好恰好有n个字符要符合x规则
         */

        //String 类的matches()方法中的参数位置进行填写正则表达式
        return number.matches("[1][3|5|7|8][0-9]{9}");
    }

通过上方的代码可以明显的看出使用正则表达式的便利,这里再做一点扩展

 //使用正则表达式判断开开心心、快快乐乐、高高兴兴等aabb类型字符串 \\1 、\\2是对前面的(.)字符进行标记
        System.out.println("开开心心".matches("(.)\\1(.)\\2"));
        System.out.println("快快乐乐".matches("(.)\\1(.)\\2"));
        System.out.println("高高兴兴".matches("(.)\\1(.)\\2"));

        //使用正则表达式判断开心开心、考虑考虑等acac类型字符串
        System.out.println("开心开心".matches("(..){2}"));
        System.out.println("考虑考虑".matches("(..){2}"));

        //使用正则表达式判断开心开、考虑考等aca类型字符串 \\1 、\\2是对前面的(.)字符进行标记,{0}表示前面的(.)再出现0次
        //对于开开心心类型的正则表达式"(.)\\1(.)\\2" 完整格式是"(.)\\1{1}(.)\\2{1}" {1}表示前面的(.)再出现1次,只不过这里的{1}是默认的,可以省略不写
        System.out.println("开心开".matches("(.)\\1{0}(.)\\2{0}(.)\\1{0}"));
        System.out.println("考虑考".matches("(.)\\1{0}(.)\\2{0}(.)\\1{0}"));

正则表达式-字符类
  • 语法示例: 表示匹配单个字符 ^ 取反 - 范围

    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之间的任意一个字符。

正则表达式-逻辑运算符
  1. &&:并且
  2. | :或者
正则表达式-预定义字符
  • 语法示例:
    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]
正则表达式-数量词
  • 语法示例:
    1. X? : 0次或1次
    2. X* : 0次到多次
    3. X+ : 1次或多次
    4. X{n} : 恰好n次
    5. X{n,} : 至少n次,包含n
    6. X{n,m}: n到m次(n和m都是包含的)
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值