JAVA—正则表达式

关于正则表达式的了解学习,以及用于校验格式,信息查找和替换分割内容。

目录

1.概述

2.书写规则

3.应用案例

4.用于信息查找

5.用于搜索替换,分割内容


1.概述

由一些特定的字符组成,代表一个规则
作用:

1.校验数据是否合法

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

java 复制代码
package regax;

public class Text1 {
    public static void main(String[] args) {
        //目标:体验使用正则表达式
        //需求:校验QQ号码是否正确,要求全是数字,长度在(6-20)之间,不能以0开头

        System.out.println(checkQQ(null));
        System.out.println(checkQQ("1234655"));
        System.out.println(checkQQ("4654a65"));
        System.out.println("___________________________________");

        System.out.println(checkQQ1(null));
        System.out.println(checkQQ1("1234655"));
        System.out.println(checkQQ1("4654a65"));
        System.out.println("___________________________________");

    }
    public static boolean checkQQ1(String qq){
        return qq != null && qq.matches("[1-9]\\d{5,19}");
    }

    public static boolean checkQQ(String qq){
        //判断是否为null
        if(qq == null || qq.startsWith("0")||qq.length()<6||qq.length()>20){return false;}

        //判断是否都是数字
        for (int i = 0; i < qq.length(); i++) {
            //根据索引获取对应数据
            char ch = qq.charAt(i);
            //判断ch的字符
            if(ch<'0'||ch>'9'){return false;}
        }
        return true;
    }
}

相比常规的方法,正则表达式更加简洁方便


2.书写规则

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

public boolean matches(String regex) 判断字符串是否匹配,匹配返回true,反之返回false
字符类

abc 只能是abc

\^abc 除了zbc外的字符

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

a-z\&\&\[\^m-p] a到z,除了m到p

"匹配内容 (匹配内容)"
预定义字符集

. 匹配任意字符

\d 匹配数字,等价于 0-9

\D 匹配非数字,等价于 \^0-9

\w 匹配单词字符,包括字母、数字和下划线,等价于 a-zA-Z0-9_

\W 匹配非单词字符,等价于 \^a-zA-Z0-9_

\s 匹配空白字符,包括空格、制表符和换行符等,等价于 \\f\\r\\n\\t\\v

\S 匹配非空白字符,等价于 \^ \\f\\r\\n\\t\\v
数量词

(判断出现次数)

X ? 表示 0 或 1 次匹配。

X * 表示 0 或多次匹配。

X+ 表示 1 或多次匹配。

X{n} 表示精确匹配 n 次。

X{n,} 表示至少匹配 n 次。

X {n,m} 表示至少匹配 n 次,最多匹配 m 次。
元字符:

^ 匹配输入字行首。

$ 匹配输入行尾。

\ 将下一个字符标记为特殊字符或转义字符。
模式修正符

i 表示忽略大小写。

m 表示多行匹配。

s 表示单行匹配


3.应用案例

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

java 复制代码
package regax;

import java.util.Scanner;

public class Text2 {
    public static void main(String[] args) {
        //checkTel();
        checkTime();
    }

    public static void checkTel(){
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入电话号码|座机");
            String phone = sc.next();
            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 static void checkEmail(){
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入邮箱");
            String email = sc.next();
            if(email.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
                System.out.println("您输入的格式正确");
                break;
            }
            else{
                System.out.println("您输入的邮箱格式不正确");
            }
        }
    }

    public static void checkTime(){
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入时间");
            String time = sc.next();
            if(time.matches("1?[0-9]:[0-6][0-9]|2?[0-4]:[0-6][0-9]|[0-9]:[0-6][0-9]")){
                System.out.println("您输入的格式正确");
                break;
            }
            else{
                System.out.println("您输入的时间格式不正确");
            }
        }
    }
}

4.用于信息查找

需求:把文本中的电话,邮箱,座机号码,热线都爬取出来

java 复制代码
package regax;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Text3 {
    public static void main(String[] args) {
        String data = "java学习\n"+"电话:18703442157\n"+"邮箱:2293581974@qq.com\n";

        //定义爬取规则(正则表达式)
        String regex = "(1[3-9]\\d{9})|(\\w{1,}@\\w{2,10})(\\.\\w{2,10}){1,2}|(0\\d{2,5}-?\\d{5,15})";
        //2.把 爬取规则封装成一个pattern对象
        Pattern pattern = Pattern.compile(regex);
        //3.通过pattern对象得到查找内容的匹配器
        Matcher matcher = pattern.matcher(data);
        //4.通过匹配器开始去内容中查找信息
        while(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

5.用于搜索替换,分割内容

实现功能需要结合以下的方法

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

java 复制代码
package regax;

import java.util.Arrays;

public class Text4 {
    public static void main(String[] args) {
        //1.内容替换
        //需求 将非中文字符成-
        String s1 = "陈平安hsgjel宁姚gjoass阮秀lfh";
        System.out.println(s1.replaceAll("\\w+", "-"));

        //需求 删除重复字符
        String s2 = "我我我喜欢编编编编编编编编编编编编程";
        /*
        * (.)  一组,匹配任意字符
        * \\1  为这个组声明一个组好 1号
        * +    声明必须是重复字
        * $1   去访问到第一组代表的那个重复的字
        * */
        System.out.println(s2.replaceAll("(.)\\1+", "$1"));

        //需求 获取人名
        String s3 = s1;
        String[] name = s3.split("\\w+");
        System.out.println(Arrays.toString(name));
    }
}

相关推荐
JAVA面经实录9171 分钟前
集合框架 (六)
java·开发语言
骇客野人5 分钟前
Linux 查看 Java 进程常用命令
java·linux·运维
周GZ41 分钟前
简单讲解Java中静态方法与 实例方法
java·开发语言
疯狂打码的少年1 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
马上去吃汉堡王1 小时前
Windows11安装Geant4
笔记
气泡水。1 小时前
RHCSA笔记实记
linux·笔记
盗理者2 小时前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
GitLqr2 小时前
Java 26 终于原生支持 HTTP/3 了:告别 Netty,直接用 QUIC
java·netty·http3
用户40966601317512 小时前
Jackson 序列化:@JsonIgnore / @JsonProperty / @JsonFormat / @JsonInclude / @JsonUnwrapped 一次讲清楚
java·后端
码路漫漫2 小时前
用了 Caffeine,消息为什么还是被处理了两次?
java