正则表达式

🧩 基本语法组成

正则表达式的语法主要由普通字符和特殊字符(元字符)组成1。以下是常见的语法规则:

1. 基础字符与元字符
  • .:匹配除换行符之外的任何单个字符。
  • \d:匹配一个数字字符,等同于 [0-9]
  • \D:匹配一个非数字字符。
  • \w:匹配字母、数字、汉字或下划线。
  • \s:匹配任意的空白符(如空格、换行符、制表符等)。
2. 字符类
  • [abc]:匹配方括号中的任意一个字符(如 a、b 或 c)。
  • [^abc]:匹配不在方括号内的任意字符。
  • [a-z]:匹配任意小写字母。
3. 数量词(限定符)
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • {n}:恰好匹配前面的字符 n 次。
  • {n,}:至少匹配 n 次。
  • {n,m}:匹配 n 到 m 次。
4. 边界与定位符
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • \b:匹配单词边界。
5. 分组与选择
  • (pattern):匹配 pattern 并捕获该子表达式,可用于提取匹配的文本。
  • |:选择符,表示"或"的关系。例如 a|b 表示匹配 a 或 b。

二、入门教程

1. 引入依赖
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2. 参数校验: 使用 @Pattern 注解(最常用)
java 复制代码
import javax.validation.constraints.Pattern;
import javax.validation.constraints.NotBlank;

public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    // 只允许字母和数字
    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "用户名只能包含字母和数字")
    private String username;

    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;
}

在 Controller 中,只需加上 @Valid 注解即可触发校验:

java 复制代码
@PostMapping("/register")
public String register(@Valid @RequestBody UserDTO user) {
    return "注册成功";
}
3. 智能路由:在 URL 路径中使用正则
java 复制代码
// 匹配 /products/ 下的分类名(只能是小写字母和横杠) 和 数字ID
@GetMapping("/products/{category:[a-z-]+}-{id:\\d+}")
public String getProduct(@PathVariable String category, @PathVariable Long id) {
    return "分类: " + category + ", ID: " + id;
}

// 提取 API 版本号
@GetMapping("/api/v{version:\\d+}/users")
public String getUsers(@PathVariable int version) {
    return "API 版本: " + version;
}
4. 业务逻辑:敏感信息检测 / 数据清洗
java 复制代码
@Service
public class SensitiveInfoService {
    // 身份证号正则
    private static final Pattern ID_CARD_PATTERN = Pattern.compile("(\\d{17}[\\dXx]|\\d{15})");

    public boolean containsSensitiveInfo(String content) {
        Matcher matcher = ID_CARD_PATTERN.matcher(content);
        return matcher.find(); // 只要找到就返回 true
    }
}
相关推荐
云贝贝贝19 分钟前
腾讯云 TDSQL(MySQL 版)运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR
运维·mysql·腾讯云
wxwx_bscxy32223 分钟前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
剑之所向1 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
词却2 小时前
数据库基础:DQL 数据查询语言
数据库·oracle
昌原的儿子LEO4 小时前
Linux IO多路复用与SQLite数据库核心知识点总结
linux·数据库·oracle
山岚的运维笔记4 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
聚美智数4 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
坐吃山猪5 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程
数智启示录5 小时前
PostgreSQL 内存调优实战(第 12 篇):work_mem 只调大 64 倍,峰值为什么远不止 64 倍
运维·数据库·经验分享·postgresql·面试
姜太小白6 小时前
【Oracle】记排查sh脚本调用SQL执行卡顿的排查总结
数据库·sql·oracle