Java零基础入门-Java正则表达式

一、概述

        在上一期,我们是重点学习了java反射机制的基础及一些实际运用,比如对于给定一个对象就可任意获取该对象任意信息,包括类包名、类名、类方法、类属性等信息。那我们这就算对jav反射有一定的基础认知了,那我们就算毕业了么?肯定不是,涉及的反射的知识点,远不于此,那如果你们真正想学好,还得接着去把反射更深的应用去理解清楚。

        接下来这一期我是想给大家普及一下,java的正则表达式。

二、本期教学目标

  • 掌握何为正则表达式
  • 正则所支持的合法字符
  • 正则所支持的特殊字符
  • 预定义字符
  • 方括号表达式
  • 边界匹配符
  • 三种模式的数量表示符
  • 正则实现验证电话号码

三、正文

1️⃣概念

        说起正则,肯定大家都熟悉,正则,又称正规表示法,在代码中常简写为[ regex ]。谈起正则,它是一个强大的字符串处理工具,可以对字符串进行提取、查找、替换、分割等字符串操作,是一种可以用于模式替换和匹配的规范。对于一个正则,就是由普通字符(如:a~z)和特殊字符串组成。

        而在String类中,它就提供了几种针对如上所提及到的字符串操作方法,具体如下:

  • boolean matches(String regex):判断该字符串是否匹配该正则表达式。
  • String replaceAll(String regex, String replacement):将该字符串中所有是 regex 的子串都替换成 replacement字符串。
  • String replaceFirst(String regex, String replacement):将该字符串中的第一个是 regex 的子串替换成 replacement字符串。
  • String[] split(String regex):以 regex 作为分隔符,把该字符串分割成多个以regex 分割开的子串。

        至于如上方法,你们有空的也可以去写点demo尝试一下,还是非常好使,至于matches()方法,我就是得在下方必须实际会用到的,这个你们待会儿可以参考一下。

2️⃣正则所支持的合法字符

        如下我会列举出正则所支持的合法字符,这个你们得看看。

  • X:字符x(x 是可代表任何合法的字符)。
  • \0mnn:八进制数 0mnn 所表示的字符。
  • \xhh:十六进制值 0xhh 所表示的字符。
  • \t:制表符
  • \n:换行符
  • \r:回车符
  • \f:换页符
  • \e:Escape 符
  • \cx:x 对应的的控制符。

        除此之外,正则表达式中还有一些特殊字符,这些特殊字符在正则表达式中有着发挥特殊的用途,就好比前面介绍的反斜线\,它就算一个

3️⃣正则所支持的特殊字符

        如下是要使用这些特殊字符,就必须先将这些字符转义,也就是在前面添加一个反斜线\即可。具体诺列请看如下:

  • $:匹配一行的结尾。如果要匹配()字符,请加上反斜杠,比如\$。
  • ^:匹配一行的开头。
  • ():标记子表达式的开始和结束位置。
  • []:用于确定中括号表达式的开始和结束位置。
  • {}:用于标记前面子表达式的出现频度。
  • *:指定前面子表达式可以出现零次或多次。
  • +:指定前面子表达式可以出现一次或多次。
  • ?:指定前面子表达式可以出现零次或一次。
  • .:匹配除换行符\n之外的任何单字符。
  • \:用于转义下一个字符,或指定八进制、十六进制字符。
  • |:指定两项之间任选一项。

注意:对于如上特殊字符,如果要匹配其自身请加上反斜杠,比如\{、\+、\?等。

然后将上面的多个字符拼起来,就可以创建一个正则表达式。例如:

"\u0041\\%" // 匹配 A跟%
"\\*\\?"  // 匹配 * ?

你们可能会发现,怎么怎么多反斜杠其实呢,对于反斜杠本身也需要转义,'\\'等于一个反斜杠。 

4️⃣预定义字符

        对于上面而言,只能匹配单个字符,如果想匹配多个,可以使用“通配符”,它可以匹配多个字符,对于正则中的通配符,远比超过普通通配符的功能,它就是预定义字符,如下是一些常用的预定义字符。

  • . :可以匹配任何字符.
  • \d :匹配 0~9 的所有数字.
  • \D :匹配非数字.
  • \s :匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等.
  • \S :匹配所有的非空白字符.
  • \w :匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线("_")
  • \W:匹配所有的非单词字符.

        有了预定义字符的出现,我们就可以来定义多字符的来进行匹配了。

\\d\\d\\d-\\d\\d\\d\\d-\\d\\d\\d\\d    // 匹配如 000-0000-0000 形式的电话号码

5️⃣方括号表达式

        在对于一些特殊情况,比如只匹配a~z之间的任意一个字符,那么使用预定义字符就显得非常无力,此时就需要使用方括号来表示了,具体解释如下:

  1. 对于[ac],就表示ac中的任意一个。
  2. 表示范围可用-组合使用,比如:[a-z]表示 a~z 范围内的任意字符。
  3. 表示求否可用^组合使用;例如:[^abc]表示除a、b、c 外的任意字符。
  4. ...

6️⃣边界匹配符

        除以上这些之外,Java 正则还支持如下 所示的几个边界匹配符。

  • ^:行的开头
  • $:行的结尾
  • \b:单词的边界
  • \B:非单词的边界
  • \A:输入的开头
  • \G:前一个匹配的结尾
  • \Z:输入的结尾,仅用于最后的结束符
  • \z:输入的结尾

7️⃣三种模式的数量表示符

        如下是对于三种模式(贪婪模式、勉强模式、占有模式)的数量表示符的具体说明。

8️⃣正则实现验证电话号码

        具体学习了如上正则,我觉得基本有能力徒手实现该手机号的正则校验了,接下来我就给大家演示一下,如何定义一个正则,且如何通过字符串去匹配?

具体演示代码请看如下:

public static void main(String[] args) {
        //定义一个验证手机号的正则表达式
        String regex = "^1[3|4|5|7|8][0-9]{9}$";
        String answer = "y";
        do {
            System.out.print("请输入您要注册的电话号码:");
            Scanner scan = new Scanner(System.in);
            String phone = scan.next();    // 接收用户在控制台输入的电话号码
            Pattern pattern = Pattern.compile(regex);    // 编译正则表达式
            Matcher matcher = pattern.matcher(phone);    // 创建给定输入模式的匹配器
            boolean bool = matcher.matches();
            if (bool) { // 如果验证通过
                System.out.println("输入的电话号码格式正确。");
            } else {
                System.out.println("输入的电话号码格式错误。");
            }
            System.out.print("是否继续输入?(y/n)");
            answer = scan.next();
        } while (answer.equalsIgnoreCase("y"));
        System.out.println("注册结束。");
    }

其中: do…while 语句进行循环操作,当用户输入n,则跳出循环。String类中的equalsIgnoreCase() 方法作用是将字符串与指定的对象比较,不区分大小写。

重点其实也就是正则的编写 如果你们还没有完全学会,可以先参考下我这边给到的,然后一句一句解析;String regex = "^1[3|4|5|7|8][0-9]{9}$";

具体演示结果如下:

请输入您要注册的电话号码:1
输入的电话号码格式错误。
是否继续输入?(y/n)y
请输入您要注册的电话号码:1
输入的电话号码格式错误。
是否继续输入?(y/n)y1
请输入您要注册的电话号码:15797701911
输入的电话号码格式正确。
是否继续输入?(y/n)n
注册结束。

        相对而言还是挺好玩的,就是需要你们大家在入门java正则的同时,能去主动思考一下校验规则,比如校验邮箱、校验门牌号、校验身份证号等之类的常见需求场景,这样才能进步的快。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值