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

目录

摘要

一、正则表达式是什么?

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

[1. 元字符](#1. 元字符)

[2. 字符集与范围](#2. 字符集与范围)

[3. 常用预定义字符集](#3. 常用预定义字符集)

[4. 分组与反向引用](#4. 分组与反向引用)

捕获分组:

非捕获分组:

[三、Java 中正则表达式的实现](#三、Java 中正则表达式的实现)

[1. Java 基础示例](#1. Java 基础示例)

[2. 替换字符串](#2. 替换字符串)

[3. 验证输入格式](#3. 验证输入格式)

[4. 提取信息](#4. 提取信息)

[5. 拆分字符串](#5. 拆分字符串)

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

[1. 手机号验证](#1. 手机号验证)

[2. 提取 HTML 标签内容](#2. 提取 HTML 标签内容)

[3. 替换多余空格](#3. 替换多余空格)

五、总结

摘要

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

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

一、正则表达式是什么?

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

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

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

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

  1. 普通字符:字母、数字、未被特殊定义的符号(如 abc, 123)。
  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]:匹配 abc
  • [0-9]:匹配任意数字(0 到 9)。
  • [a-zA-Z]:匹配任意大小写字母。
  • [^abc]:匹配除 a, b, c 之外的任意字符。

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 中使用正则表达式进行基本的匹配:

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() 方法,可以快速替换匹配的内容:

java 复制代码
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. 验证输入格式

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

java 复制代码
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 地址:

java 复制代码
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 方法将字符串按正则模式分割:

java 复制代码
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. 手机号验证

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

2. 提取 HTML 标签内容

java 复制代码
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. 替换多余空格

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

五、总结

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

相关推荐
疯狂吧小飞牛1 天前
正则表达式特殊字符
正则表达式
White graces1 天前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
astragin1 天前
正则表达式常用记录
正则表达式
不会玩技术的技术girl1 天前
使用Python和正则表达式爬取网页中的URL数据
开发语言·python·正则表达式
疯狂吧小飞牛1 天前
正则表达式–断言
正则表达式
yuanbenshidiaos1 天前
【正则表达式】
数据库·mysql·正则表达式
奔跑吧邓邓子2 天前
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
爬虫·python·正则表达式·进阶·高级
阿华的代码王国2 天前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目
程序员小王꧔ꦿ3 天前
BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的核心差异及适用场景
正则表达式·beautifulsoup
程序员小王꧔ꦿ3 天前
BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景
正则表达式·beautifulsoup