正则表达式

正则表达式

作用

  • 可用一些规定的字符来制定规则,并用来检验数据格式的合法性

正则表达式初体验

**问题:**校验一个qq号码是否正确,6位及20位之内,必须全部是数字 。

**解题思路:**现有知识解决,在使用正则表达式体验

public class RegexDemo01 {
    public static void main(String[] args) {
        /*
            校验一个qq号码是否正确,6位及20位之内,必须全部是数字 。
         */
        System.out.println(checkQQ("123144"));
        System.out.println(checkQQ("sjfj2323"));
        System.out.println(checkQQ("fjs2"));
       // 正则表达式
        System.out.println(checkQQByRegex("jfsie32223"));
        System.out.println(checkQQByRegex("232343"));
    }
    public static boolean checkQQByRegex(String qq){
        // String类中提供了matches()方法,对正则表达式进行匹配 \d:表示数字 在Java中单斜杠要加转义字符 \,表示单斜杠
        return qq != null && qq.matches("\\d{6,20}");
    }
    public static boolean checkQQ(String qq){
        // qq为null,长度小于6,长度大于20,都为false
        if (qq == null || qq.length() < 6 || qq.length() > 20) {
            return false;
        }
        // 判断qq是否全为数字,不是返回false
        for (int i = 0; i < qq.length(); i++) {
            // 获取每位字符
            char ch = qq.charAt(i);
            // 出现不是数字的就返回false
            if (ch < '0' || ch > '9') {
                return false;
            }
        }
        // 全为数字,返回true
        return true;
    }
}

匹配方法

字符串对象提供的匹配正则表达式的方法

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

正则表达式书写

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

表达式描述
[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-lq-z]a到z,除了m到p
[ad-z]a到z,除了b和c:[a-b&& [^bc]]

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

表达式描述
.(点)任何字符
\d一个数字,[0-9]
\D非数字: [^0-9]
\s一个空白字符: [ \t\n\x0B\f\r]
\S非空白字符: [^\s]
\w[a-zA-Z_0-9] 英文、数字、下划线
\W[^\w] 一个非单词字符

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

表达式描述
X?X,一次或根本没有
X*X,零次或多次
X+X,一次或多次
X {n}X,正好n次
X{n,}X,至少n次
X{n,m}X,至少n次 但不超过m次

代码示例

public class RegexDemo02 {
    public static void main(String[] args) {
        // 字符类 只能是 a b c
        System.out.println("a".matches("[abc]"));
        System.out.println("z".matches("[abc]"));
        // 字符类 不能是 a b c
        System.out.println("a".matches("[^abc]"));
        System.out.println("bz".matches("[^abc]"));
        // 预定义类
        System.out.println("a".matches("\\d"));//一个数字
        System.out.println("1".matches("\\D"));// 一个非数字
        // 贪婪的量词
        System.out.println("123".matches("\\d{3}"));// 三个数字
        System.out.println("ac".matches("\\s{2}"));// 两个空白字符
        // 校验密码 必须是数字、字母、下划线 至少6次
        System.out.println("fj32_".matches("\\w{6,}"));
        // 验证码 必须是数字和字符,必须4位
        System.out.println("je33".matches("[\\w&&[^_]]{4}"));
    }
}

案列-验证邮箱

public class RegexDemo03 {
    public static void main(String[] args) {
        // 对邮箱格式进行判断 1335353@qq.com 111112443@.com.cn
        System.out.println(checkEmail("1543@qqd.com.cn"));
        System.out.println(checkEmail("111112443@khg.com.cn"));
    }
    public static boolean checkEmail(String email){
        /*
            1到30位的数字、字母、下划线
            一位@字符
            2到20位的数字、字母、
            (一位. 2到20位数字、字母、)1到2次
         */
        if (email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")) {
            return true;
        }else {
            return false;
        }
    }
}

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

方法名说明
public String replaceAll(String regex,String newStr)按照正则表达式匹配的内容进行替换
public String[] split(String regex):按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。

代码实现

public class RegexDemo04 {
    public static void main(String[] args) {
        // 正则表达式分割
        String names = "小明232sfhsh大明232sj李雷";
        String[] name = names.split("\\w+");
        for (int i = 0; i < name.length; i++) {
            System.out.println(name[i]);
        }
        // 正则表达式 替换
        String namesNew = names.replaceAll("\\w+", ",");
        System.out.println(namesNew);
    }
}

正则表达式爬取信息

public class RegexDemo05 {
    public static void main(String[] args) {
        String string = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
                "itcast@itcast.cn,电话18762832633,0203232323" +
                "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
        /*
         需求:从上面的内容中爬取出 电话号码和邮箱。
         */
        /*
            1.定义爬取规则
            邮箱: \w{1,30}@[a-zA-Z0-9]{2,20}(\.[a-zA-Z0-9]{2,20}){1,2}
            电话号码:
                [1][3-9]\d{9} 第一位以1开头 第二位3-9 剩下9位0到9
                0[2-6]0-?\d{5,20}
                400-?\d{3,9}-?\d{3,9}
         */
        String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|[1][3-9]\\d{9}" +
                "|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";
        // 2.将爬取规则编译成匹配对象
        Pattern pattern = Pattern.compile(regex);
        // 3.得到一个内容匹配对象
        Matcher matcher = pattern.matcher(string);
        // 4.开始找匹配的内容
        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼不咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值