正则表达式

1、概念

就是由一些特定的字符组成,代表的是一个规则。

2、作用:

①用来校验数据格式是否合法

②在一段文本中查找满足要求的内容

3、概述、初体验

public class Test1 {
    //目标:体验一下使用正则表达式来校验数据格式的合法性
    //需求:校验qq的号码是否正确,要求全部是数字,不能以0开头,长度在(6,20)之间
    public static void main(String[] args) {
        System.out.println(checkqq(null));
        System.out.println(checkqq("2341250234"));
        System.out.println(checkqq("234gh8765"));

    }
    //正则表达式
    public static  boolean checkqq(String qq){
        return qq!=null&&qq.matches("[1-9]\\d{5,19}");
    }
    public static boolean checkQQ( String qq){
        //1、判断QQ号码是否为null
        if (qq==null||qq.startsWith("0")||qq.length()<6&&qq.length()>20){
            return false;
        }
        //2、判断qq号码中是否是数字
        for (int i = 0; i < qq.length(); i++) {
            //根据索引提取当前位置处的字符
            char a=qq.charAt(i);
            //判断a记住的字符,如果不是数字,qq不合法
            if (a<'0'||a>'9'){
                return false;
            }
        }
        //说明qq号码是合法的
        return true;
    }

}

String提供了一个匹配正则表达式的方法

|-------------------------------------------------------------------------|
| public boolean matches (String regex)判断字符串是否匹配正则表达式,匹配返回true,不匹配返回false |

正则表达式的书写规则

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-z&&[def]] | d,e,或f交集 |
| [a-z&&[^bc]] | a到z,除了b和c(等同于【ad-z】) |
| [a-z&&[^m-p]] | a到z,除了m到p(等同于【a-1q-z】) |

预定义字符(只匹配单个字符)

|-----|------------------|
| . | 任何字符 |
| \d | 一个数字:【0-9】 |
| \D | 非数字:【^0-9】 |
| \s | 一个空白字符 |
| \S | 非空白字符:【^\s】 |
| \w | [a-zA-Z_0-9] |
| \W | [^\w]一个非单词字符 |

数量词

?,*,+,{n}(数量词)

|--------|--------------|
| x? | x,一次或0次 |
| x* | x,零次或多次 |
| x+ | x,一次或多次 |
| x{n} | x,正好n次 |
| x{n,} | x,至少n次 |
| x{n,m} | x,至少n次但不超过m次 |

以上带【内容】只能匹配单个字符,预定义字符只能匹配单个字符

在Java中,\是有特殊用途的,例如特殊字符\t,代表缩进\n代表换在java中希望\就是\,则必须要转义。

其他几个常用的字符:(?i):忽略大小写,分组()

案例:

需求:校验用户输入的电话,邮箱,时间是否合法

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
checkphone();
    }
    public static void checkphone(){
        while (true) {
            System.out.println("请您输入手机号码");
            Scanner sc=new Scanner(System.in);
            String phone=sc.nextLine();
            if (phone.matches("(1[3-9]\\d{9})|(0\\d[2-7]-?[1-9]\\d{4,19})")){
                System.out.println("输入的格式正确");
                break;
            }else {
                System.out.println("您输入的号码格式不正确");
            }
        }

    }
}

public class Test3 {
    //目标:正确使用正则表达式查找内容
    public static void main(String[] args) {
        method1();
    }
    //从以下内容中爬取出,手机,邮箱,座机,400电话等信息
    public static void method1(){
        String data="来黑马程序员学习Java,\n"+
                "电话:1866668888,18699997777\n"+
                "座机电话:01036517895,010-98951256\n"+
                "邮箱:boniu@itcast.cn,\n"+
                "邮箱:dlie0009@163.com,\n"+
                "热线电话:400-619-9090,400-618-4000";
        //1、定义爬取的规则
        String regex="(1[3-9]\\d{9})|(0\\d[2-7]-?[1-9]\\d{4,19})";
        //2、把正则表达式封装成一个Pattern对象
        Pattern pattern=Pattern.compile(regex);
        //3、通过Pattern对象去获取查找内容的匹配器对象
        Matcher matcher=pattern.matcher(data);
        //定义一个循环来爬取信息
        while (matcher.find()){
            String rs=matcher.group();
            System.out.println(rs);
        }
    }
}

正则表达式用于搜索替换、分割内容,需要结合String提供的如下方法完成:

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

import java.util.Arrays;

public class Test4 {
    public static void main(String[] args) {
        //public String replaceAll(String regex,String newStr)	按照正则表达式匹配的内容进行替换
        //需求1、请把 古力娜扎ai8888迪丽热巴999888as马儿扎哈fsfsedc卡尔炸吧,中间的非英文字符替换成"-"
        String s1="古力娜扎ai8888迪丽热巴999888as马儿扎哈fsfsedc卡尔炸吧";
        System.out.println(s1.replaceAll("\\w+", "-"));
        //需求2、某语音系统收到一个口吃的人说的"我我我喜欢编编编程程!",需要优化成"我喜欢编程"
        String s2="我我我喜欢编编编程程";
        /*
        (.)一组:匹配任意字符的
        \\1:为这个组声明一个组号:1号
        +;声明必须是重复的字
        $1可以取到第一组代表的那个重复的字
         */
        System.out.println(s2.replaceAll("(.)\\1+", "$1"));
       // public String [ ] split (String regex):	按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
        //需求1:请把 古力娜扎ai8888迪丽热巴999888as马儿扎哈fsfsedc卡尔炸吧,中间的人名获取出来
       String[]names= s1.split("\\w+");
        System.out.println(names);
        System.out.println(Arrays.toString(names));
    }
}
相关推荐
m0_571957581 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生3 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2343 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程3 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk4 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*4 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go