当前位置: 首页 > article >正文

深入理解正则表达式及基本使用教程

目录

摘要

一、正则表达式是什么?

二、正则表达式的基本语法

1. 元字符

2. 字符集与范围

3. 常用预定义字符集

4. 分组与反向引用

捕获分组:

非捕获分组:

三、Java 中正则表达式的实现

1. Java 基础示例

2. 替换字符串

3. 验证输入格式

4. 提取信息

5. 拆分字符串

四、常见正则表达式应用场景

1. 手机号验证

2. 提取 HTML 标签内容

3. 替换多余空格

五、总结

摘要

        正则表达式(Regular Expression,简称 Regex)是一种文本处理的利器,它广泛应用于验证、搜索、提取和替换文本的场景中。在 Java 中,正则表达式被 java.util.regex 包很好地支持,提供了强大的匹配能力。

本文将带你从零学习正则表达式,涵盖基本语法、实际应用场景以及详细的 Java 代码示例,帮助你掌握这项极为实用的技能。

一、正则表达式是什么?

正则表达式是一种用于描述文本模式的语言。通过正则表达式,你可以对文本执行以下操作:

  1. 验证:检查字符串是否符合特定规则(如邮箱格式、手机号验证)。
  2. 提取:从复杂的文本中提取有用信息(如时间、日期、IP 地址)。
  3. 替换:替换特定模式的字符(如清理多余空格或替换敏感信息)。
  4. 分割:将一个字符串按照模式拆分成多个部分。

二、正则表达式的基本语法

正则表达式由普通字符和元字符组成:

  1. 普通字符:字母、数字、未被特殊定义的符号(如 abc123)。
  2. 元字符:具有特殊含义的字符(如 .*[ ]^$ 等)。

1. 元字符

以下是常用的元字符及其含义:

元字符描述示例
.匹配任意单个字符(除换行符外)正则 a.c 匹配 "abc""a1c"
^匹配字符串的开始正则 ^abc 匹配以 "abc" 开头的字符串
$匹配字符串的结束正则 xyz$ 匹配以 "xyz" 结尾的字符串
*匹配前一个字符零次或多次正则 ab* 匹配 "a""ab""abb"
+匹配前一个字符一次或多次正则 ab+ 匹配 "ab""abb"
?匹配前一个字符零次或一次正则 ab? 匹配 "a""ab"
{n}匹配前一个字符恰好 n 次正则 a{3} 匹配 "aaa"
{n,}匹配前一个字符至少 n 次正则 a{2,} 匹配 "aa""aaa"
{n,m}匹配前一个字符至少 n 次,至多 m 次正则 a{2,4} 匹配 "aa""aaa""aaaa"
[]匹配方括号中的任意一个字符正则 [abc] 匹配 "a""b""c"
``表示逻辑“或”
\转义符,用于匹配元字符的字面含义正则 \. 匹配 "."

2. 字符集与范围

字符集通过 [] 定义,用于匹配集合中的任意字符。通过 - 可以定义范围:

  • [abc]:匹配 a 或 b 或 c
  • [0-9]:匹配任意数字(0 到 9)。
  • [a-zA-Z]:匹配任意大小写字母。
  • [^abc]:匹配除 abc 之外的任意字符。

3. 常用预定义字符集

预定义字符集是正则表达式的快捷方式,简化了常见模式:

符号描述等价写法
\d匹配任意数字(0-9)[0-9]
\D匹配任意非数字字符[^0-9]
\w匹配字母、数字或下划线[a-zA-Z0-9_]
\W匹配非字母、数字或下划线[^a-zA-Z0-9_]
\s匹配空白字符(空格、制表符等)[ \t\n\r\f\v]
\S匹配非空白字符[^ \t\n\r\f\v]

4. 分组与反向引用

括号 () 用于分组,分组的内容可以单独提取或重复使用:

捕获分组:
  • (abc):匹配 "abc" 并捕获。
  • 捕获的内容可以通过 \1\2 等引用。
非捕获分组:
  • (?:abc):匹配 "abc",但不捕获。

三、Java 中正则表达式的实现

Java 提供了 java.util.regex 包,包含两个核心类:

  1. Pattern:正则表达式的编译表示。
  2. Matcher:用于执行匹配操作的引擎。

1. Java 基础示例

以下代码展示了如何在 Java 中使用正则表达式进行基本的匹配:

import java.util.regex.*;

public class RegexDemo {
    public static void main(String[] args) {
        String text = "今天是2023年10月8日";
        String pattern = "\\d+"; // 匹配一个或多个数字

        // 编译正则表达式
        Pattern compiledPattern = Pattern.compile(pattern);

        // 创建匹配器
        Matcher matcher = compiledPattern.matcher(text);

        // 查找所有匹配项
        while (matcher.find()) {
            System.out.println("匹配到的数字: " + matcher.group());
        }
    }
}

//输出
匹配到的数字: 2023
匹配到的数字: 10
匹配到的数字: 8

2. 替换字符串

使用 String 类的 replaceAll() 方法,可以快速替换匹配的内容:

public class ReplaceExample {
    public static void main(String[] args) {
        String text = "价格是100美元";
        String pattern = "\\d+"; // 匹配数字

        // 替换数字为 "数字"
        String result = text.replaceAll(pattern, "数字");
        System.out.println(result); // 输出:价格是数字美元
    }
}

3. 验证输入格式

正则表达式常用于验证用户输入是否符合特定规则。以下是一个验证邮箱格式的示例:

public class EmailValidation {
    public static void main(String[] args) {
        String email = "example@domain.com";
        String pattern = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}$";

        if (email.matches(pattern)) {
            System.out.println("邮箱格式正确");
        } else {
            System.out.println("邮箱格式错误");
        }
    }
}

4. 提取信息

以下代码展示了如何从日志中提取 IP 地址:

import java.util.regex.*;

public class ExtractIP {
    public static void main(String[] args) {
        String log = "用户访问IP:192.168.1.1,时间:12:30";
        String pattern = "\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b";

        Pattern compiledPattern = Pattern.compile(pattern);
        Matcher matcher = compiledPattern.matcher(log);

        if (matcher.find()) {
            System.out.println("提取到的IP地址: " + matcher.group());
        }
    }
}


//输出
提取到的IP地址: 192.168.1.1

5. 拆分字符串

你可以使用 split 方法将字符串按正则模式分割:

public class SplitExample {
    public static void main(String[] args) {
        String text = "apple,banana,orange";
        String pattern = ",";

        String[] result = text.split(pattern);
        for (String fruit : result) {
            System.out.println(fruit);
        }
    }
}


//输出

apple
banana
orange

四、常见正则表达式应用场景

1. 手机号验证

String pattern = "^1[3-9]\\d{9}$";
String phone = "13812345678";
System.out.println(phone.matches(pattern)); // 输出:true

2. 提取 HTML 标签内容

String html = "<title>正则表达式</title>";
String pattern = "<title>(.*?)</title>";
Matcher matcher = Pattern.compile(pattern).matcher(html);
if (matcher.find()) {
    System.out.println(matcher.group(1)); // 输出:正则表达式
}

3. 替换多余空格

String text = "  去除   多余  空格  ";
String result = text.replaceAll("\\s+", " ").trim();
System.out.println(result); // 输出:去除 多余 空格

五、总结

正则表达式是一项非常强大的工具,可以极大地提高文本处理的效率。在 Java 中,可以通过 PatternMatcher 类实现复杂的匹配操作。


http://www.kler.cn/a/466343.html

相关文章:

  • vuedraggable 选项介绍
  • Coroutine 基础八 —— Flow 操作符(二)
  • 从0到机器视觉工程师(二):封装调用静态库和动态库
  • 上下游服务间解耦的技术与管理
  • 图像分割基础:使用Python和scikit-image库
  • CSS3——3. 书写格式二
  • 图像转换 VM与其他格式互转
  • CLIP论文笔记
  • 2025年度全国会计专业技术资格考试 (甘肃考区)报名公告
  • 从 SQL 到 SPL:分组后每组前面增加符合条件的记录
  • 分布式练手:Server
  • 如何得到深度学习模型的参数量和计算复杂度
  • 【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能
  • 机器学习经典算法——逻辑回归
  • 在K8S中,Pod请求另一个Pod偶尔出现超时或延迟,如何排查?
  • 【LeetCode】803、打砖块
  • BurpSuite2024.11
  • JLINK V9插入电脑没反应
  • 基于深度学习的视觉检测小项目(二) 环境和框架搭建
  • pytorch张量高级索引介绍
  • Sublime Text4 4189 安装激活【 2025年1月3日 亲测可用】
  • LLM 中的 Decoder Only
  • df.set_index(‘name‘).groupby(‘team‘).apply(first_3, ‘Q1‘)
  • 被催更了,2025元旦源码继续免费送
  • 一文讲清楚webpack和vite原理
  • Vue 快速入门:开启前端新征程