正则表达式详解(regular expression)

💡 正则表达式(Regular Expression, regex)知识点总结 💡

正则表达式是一种用于匹配字符串的模式,广泛用于搜索、替换、验证等操作。


📌 正则表达式的主要作用

1️⃣ 字符串匹配 🧐

  • 检查一个字符串是否符合某种模式。
  • 例如,验证用户输入的邮箱手机号密码强度等。

2️⃣ 搜索和提取 🔍

  • 在大量文本中找到符合要求的内容。
  • 例如,从网页中提取URL、邮箱、电话号码等。

3️⃣ 字符串替换 🔄

  • 将符合规则的文本替换为指定内容。
  • 例如,把多个空格 替换成一个空格

4️⃣ 数据格式化 ✏️

  • 规范化文本数据,如日期格式 转换、去除特殊字符等。

5️⃣ 日志分析 📊

  • 通过正则表达式分析日志文件,提取错误信息IP 地址等重要数据。

📌 正则表达式的基础

  1. 普通字符匹配

    • abc 只能匹配 "abc",不会匹配 "aabc""abcd" 等。
  2. 特殊字符(元字符)

    元字符 含义 示例
    . 任意单个字符(换行符除外) "a.c" 可匹配 "abc""aac"
    \d 数字 [0-9] "12\d" 可匹配 "123""125"
    \w 字母、数字或下划线 [a-zA-Z0-9_] "\w+" 可匹配 "hello123"
    \s 空白字符(空格、制表符、换行符) "a\sb" 可匹配 "a b"
    \b 单词边界 "\bcat\b" 匹配 "cat" 但不匹配 "catalog"
    ^ 匹配行首 "^abc" 只匹配 "abc" 在行首的情况
    $ 匹配行尾 "xyz$" 只匹配 "xyz" 在行尾的情况

📌 量词(控制匹配次数)

量词 含义 示例
* 匹配 0 次或多次 a* 匹配 """a""aaaa"
+ 匹配 1 次或多次 a+ 匹配 "a""aaaa",但不匹配 ""
? 匹配 0 次或 1 次 a? 匹配 """a"
{n} 匹配 n a{3} 仅匹配 "aaa"
{n,} 至少匹配 n a{2,} 匹配 "aa""aaa"
{n,m} 匹配 nm a{2,4} 匹配 "aa""aaa""aaaa"

📌 字符类(Character Classes)

语法 含义 示例
[abc] 只匹配 abc gr[ae]y 可匹配 "gray""grey"
[^abc] a、b、c 以外的任何字符 "[^aeiou]" 匹配所有辅音字母
[0-9] 匹配 0~9 的任何数字 "[0-9]+" 匹配 "123""456"
[a-z] 匹配小写字母 "[a-z]+" 匹配 "hello"
[A-Z] 匹配大写字母 "[A-Z]+" 匹配 "HELLO"

📌 逻辑运算符

语法 含义 示例
` ` 逻辑 OR(或)
() 分组 "(ab)+" 可匹配 "ab""abab"
(?:...) 非捕获分组 "(?:ab)+" 仅匹配 "abab",但不存储匹配内容

📌 零宽断言

✨ 下面是正则表达式中 (?=) 等相关的零宽断言的作用和示例,整理成表格供你参考 📜👇

表达式 名称 🏷 作用 💡 示例
(?=...) 正向先行断言 匹配当前位置 ,后面必须满足 ... 的条件,但不消耗字符 \d(?=px) 匹配**5px 中的 5**,但不匹配 5em
(?!...) 负向先行断言 匹配当前位置 ,后面不能... \d(?!px) 匹配 5em5,但不匹配 5px
(?<=...) 正向后行断言 🔄 匹配当前位置 ,前面必须满足 ... (?<=\$)\d+ 匹配**$100 中的 100**,但不匹配 USD100
(?<!...) 负向后行断言 🚫 匹配当前位置 ,前面不能... (?<!\$)\d+ 匹配 USD100100,但不匹配 $100

💡 小贴士

  • 先行断言(?=...) & (?!...)检查后面的字符,但不消耗它们。
  • 后行断言(?<=...) & (?<!...)检查前面的字符,但不消耗它们。
  • 断言是零宽匹配(不占字符),用于复杂匹配规则!

📌 贪婪模式与懒惰模式

在正则表达式中,贪婪模式(Greedy Mode)指的是匹配时尽可能多地匹配字符。

例如:

  • a.*b"acbcb" 上的贪婪匹配 结果是 "acbcb"(尽可能匹配最长的内容)。
  • 如果使用 懒惰模式 (Lazy Mode)a.*?b,则匹配的结果是 "acb"(尽可能匹配最短的内容)。

贪婪匹配(Greedy Match)VS 懒惰匹配(Lazy Match)

模式 符号 行为
贪婪匹配(Greedy) .* 尽可能多地匹配
懒惰匹配(Lazy) .*? 尽可能少地匹配
占有匹配(Possessive) .*+ 一次性匹配,不回溯

💡 记住 :贪婪(Greedy)匹配会尽可能多地匹配字符 ,而懒惰(Lazy)匹配会尽可能少地匹配字符。🚀

📌 捕获分组与非捕获分组

📌 常见正则表达式

1️⃣ 匹配邮箱 📧:

java 复制代码
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

✅ 可匹配 "[email protected]"

2️⃣ 匹配手机号 📱(以中国手机号 1 开头):

java 复制代码
^1[3-9]\d{9}$

✅ 可匹配 "13812345678"

3️⃣ 匹配 IP 地址 🌐:

java 复制代码
^(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.
(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.
(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.
(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])$

✅ 可匹配 "192.168.1.1"

4️⃣ 匹配日期(YYYY-MM-DD) 📆:

java 复制代码
^(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

✅ 可匹配 "2024-03-14"


📌 Java 正则表达式示例

java 复制代码
import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "hello regex 123!";
        String pattern = "\\d+"; // 匹配数字

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);

        while (m.find()) {
            System.out.println("匹配到: " + m.group());
        }
    }
}

🔹 输出

java 复制代码
匹配到: 123

📌 小结

正则表达式的核心知识点

元字符(特殊字符). \d \w \s ^ $

量词* + ? {n,m}

字符类[abc] [a-z] [^0-9]

逻辑运算| ()

常见应用:邮箱、手机号、IP 地址等

相关推荐
钢板兽21 分钟前
MySQL高频八股——索引
数据库·后端·mysql·面试
我爱Jack1 小时前
Spring Boot 配置文件
java·数据库·spring boot
椰椰椰耶1 小时前
【redis】主从复制:单点问题、配置详解、特点详解
java·数据库·redis
CodeJourney.1 小时前
文献检索与下指南
数据库·人工智能·python·算法
患得患失9491 小时前
【后端】【django】【进阶】自定义管理器——封装常用查询
数据库·django·sqlite·models
朱雨鹏2 小时前
大话Redis
数据库·redis
围巾哥萧尘2 小时前
「MCP建模操作」使用Blender MCP与Cursor完成3D建模的探索之旅🧣
数据库·代码规范
微臣愚钝2 小时前
【10】高效存储MongoDB的用法
数据库·mongodb
镜舟科技3 小时前
深入理解 Bitmap 索引:原理、场景与应用案例
大数据·数据库·数据分析
小涵3 小时前
【分布式】冰山(Iceberg)与哈迪(Hudi)对比的基准测试
大数据·数据库·分布式·阿里云·架构·iceberg·hudi