正则表达式

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"+
                "邮箱:[email protected],\n"+
                "邮箱:[email protected],\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));
    }
}
相关推荐
superior tigre8 分钟前
C++学习:六个月从基础到就业——面向对象编程:虚函数与抽象类
开发语言·c++·学习
ademen14 分钟前
关于 IntelliJ IDEA 中频繁出现的 Kotlin 及其核心作用
java·开发语言·kotlin
薯条不要番茄酱20 分钟前
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
java·前端·java-ee
大苏打seven22 分钟前
Java学习笔记(多线程):ConditionObject 源码分析
java·笔记·学习
苹果酱056730 分钟前
redis系列--1.redis是什么
java·vue.js·spring boot·mysql·课程设计
卷不动的打工仔33 分钟前
Ubuntu利用docker搭建Java相关环境问题记录
java·ubuntu·docker
百锦再1 小时前
Android Studio 中文字大小的单位详解
android·xml·java·ide·app·android studio
m0_zj1 小时前
41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
开发语言·javascript·es6
海棠蚀omo1 小时前
C++笔记-list
开发语言·c++·笔记
一只叫煤球的猫1 小时前
分布式-跨服务事务一致性的常见解决方案
java·分布式·后端