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

Java中@Pattern注解实战:高效校验用户输入的正则表达式大全

1. 为什么需要Pattern注解校验用户输入在开发Web应用时用户输入校验是必不可少的一环。想象一下如果你的注册页面不校验邮箱格式数据库里可能会存入abc123这样的无效数据如果不校验密码复杂度用户可能会设置123456这种极易被破解的弱密码。前端校验固然重要但后端校验才是最后一道防线。我见过太多因为后端校验缺失导致的安全问题。有一次接手一个老项目用户名字段没有任何校验结果有人注册了包含SQL注入代码的用户名差点导致数据泄露。这就是为什么我们需要Pattern注解——它能在数据进入业务逻辑前用正则表达式这把尺子量一量输入是否合规。2. Pattern注解的基本用法2.1 注解引入与基础语法首先确保你的项目引入了Jakarta Validation API原JSR-303。如果是Spring Boot项目spring-boot-starter-validation已经包含它dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency基本使用格式非常简单Pattern(regexp 你的正则表达式, message 校验失败时的提示信息) private String fieldName;比如校验用户名只允许中文、英文和数字Pattern(regexp ^[\u4e00-\u9fa5a-zA-Z0-9]$, message 用户名只能包含中文、英文和数字) private String username;2.2 常见问题排查新手常遇到的坑是正则表达式写错导致校验不生效。我建议先用在线正则测试工具如regex101.com验证你的表达式注意Java字符串中的反斜杠需要转义比如\d要写成\\d确保字段没有被其他注解如NotNull先拦截3. 高频使用场景的正则表达式大全3.1 用户身份相关校验复杂密码要求必须包含大小写字母、数字和特殊符号长度8-20位Pattern(regexp ^(?.*[a-z])(?.*[A-Z])(?.*\\d)(?.*[$!%*?])[A-Za-z\\d$!%*?]{8,20}$, message 密码需包含大小写字母、数字和特殊符号) private String password;中国大陆手机号严谨版校验考虑号段变化Pattern(regexp ^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$, message 请输入正确的手机号) private String phone;3.2 金融相关校验银行卡号16-19位数字Pattern(regexp ^[0-9]{16,19}$, message 银行卡号应为16-19位数字) private String bankCard;金额格式支持千分位和两位小数Pattern(regexp ^\\d{1,3}(,\\d{3})*(\\.\\d{2})?$, message 金额格式如1,234.56) private String amount;3.3 业务特殊需求订单编号以字母开头后接日期和5位数字Pattern(regexp ^[A-Z]\\d{8}-\\d{5}$, message 订单编号格式如A20230801-12345) private String orderNo;颜色十六进制码Pattern(regexp ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$, message 颜色格式如#FFFFFF或#FFF) private String colorHex;4. 高级技巧与性能优化4.1 预编译正则表达式频繁使用的正则表达式应该预编译private static final Pattern USERNAME_PATTERN Pattern.compile(^[\u4e00-\u9fa5a-zA-Z0-9]$); // 在代码中使用 if(!USERNAME_PATTERN.matcher(username).matches()) { throw new IllegalArgumentException(用户名格式错误); }4.2 复杂校验的拆分策略对于特别复杂的校验如密码强度建议拆分成多个简单校验// 校验长度 Size(min 8, max 20, message 密码长度8-20位) // 校验包含数字 Pattern(regexp .*\\d.*, message 需包含数字) // 校验包含字母 Pattern(regexp .*[a-zA-Z].*, message 需包含字母) private String password;4.3 自定义校验注解当标准注解不够用时可以创建自定义注解。比如校验两次输入是否一致Target({FIELD, PARAMETER}) Retention(RUNTIME) Constraint(validatedBy MatchValidator.class) public interface Match { String field(); String message() default 字段不匹配; Class?[] groups() default {}; Class? extends Payload[] payload() default {}; } public class MatchValidator implements ConstraintValidatorMatch, String { private String field; Override public void initialize(Match constraintAnnotation) { this.field constraintAnnotation.field(); } Override public boolean isValid(String value, ConstraintValidatorContext context) { // 实现校验逻辑 } }5. 实战中的经验分享在电商项目中我们曾用Pattern解决过一个棘手问题用户输入的优惠码需要同时支持ABC-123和ABC123两种格式。最终方案是Pattern(regexp ^[A-Z]{3}-?\\d{3}$, message 优惠码格式如ABC123或ABC-123) private String promoCode;另一个经验是永远要为message留足够的信息量。曾经有个报错只显示格式错误导致客服每天要处理大量咨询。后来改成请输入13-17位的信用卡号以4/5/6开头问题减少了80%。最后提醒一点正则表达式虽然强大但不要过度使用。对于特别复杂的逻辑如身份证校验码计算应该用专门的工具类处理。

相关文章:

Java中@Pattern注解实战:高效校验用户输入的正则表达式大全

1. 为什么需要Pattern注解校验用户输入? 在开发Web应用时,用户输入校验是必不可少的一环。想象一下,如果你的注册页面不校验邮箱格式,数据库里可能会存入"abc123"这样的无效数据;如果不校验密码复杂度&#…...

Innovus低功耗设计验证全流程:从电源完整性到功能仿真

1. Innovus低功耗设计验证的核心价值 在芯片设计领域,低功耗早已不是可选项而是必选项。我经历过多个采用28nm以下工艺的项目,深刻体会到低功耗验证环节的疏忽可能导致的灾难性后果——从简单的功能异常到芯片彻底无法工作。Innovus作为业界领先的物理实…...

实战指南:在VMware虚拟化环境中构建高可用Hadoop完全分布式集群

1. 为什么选择VMware搭建Hadoop集群? 在开始动手之前,我们先聊聊为什么要在VMware虚拟化环境中搭建Hadoop集群。我见过太多初学者一上来就直接在物理机上折腾,结果遇到硬件兼容性问题时束手无策。VMware提供的虚拟化环境就像个"安全沙盒…...

从一次线上bug复盘说起:我们如何定位并修复了小程序授权那‘玄学’般的偶发失败

小程序授权偶发失败排查实录:从诡异现象到根治方案 那天下午,产品经理急匆匆地冲进技术区:"又有用户投诉登录不上了!"这已经是本周第五起类似反馈。奇怪的是,我们团队内部测试了上百次,始终无法复…...

深耕B端拓客:号码核验的行业困局与技术破局路径氪迹科技法人股东号码筛选核验系统

B端客户拓展工作中,企业核心决策人(法人、股东、董监高等)联系方式的核验与筛选,是贯穿拓客全流程的基础环节,其效率与质量直接影响后续拓客工作的投入产出比,更是决定拓客团队核心竞争力的关键因素。人工手…...

Comsol 光子晶体仿真:拓扑荷、BIC 与远场偏振的探索

comsol光子晶体仿真。 拓扑荷相关。 在merging BIC,Q因子计算。 远场偏振计算。在光子晶体领域的研究中,Comsol 是一款强大的仿真工具,能帮助我们深入探究各种复杂物理现象。今天就来聊聊利用 Comsol 进行光子晶体仿真中与拓扑荷相关、mergin…...

光伏MPPT算法仿真:开启初学者的探索之旅

光伏mppt算法仿真,针对不同工况(经典算法及智能算法),提供基础模型适合初学者(局部遮荫条件下光伏特性pv输出曲线)在光伏领域,最大功率点跟踪(MPPT)算法是提高光伏发电效…...

基于博途1200PLC + HMI水塔水位控制系统仿真探索

基于博途1200PLCHMI水塔水位控制系统仿真 程序: 1、任务:用PLC构成水塔水位自动控制系统 2、系统说明: 系统设有自动、电源复位、故障模拟模式运行水水位博途仿真工程配套有博途PLC程序IO点表PLC接线图主电路图控制流程图,附赠&am…...

探索ANSYS-Simpack的柔性化处理

ansys-simpack的柔性化处理在多体动力学仿真领域,ANSYS-Simpack凭借其强大的功能备受关注,其中柔性化处理更是为工程师们提供了更为精确和贴近实际的分析手段。 柔性化处理的意义 实际工程系统中,零部件并非绝对刚体,它们在受力时…...

<简历与博客常用> Emoji 表情符号汇总表,完整使用速查表<按场景分类>

本文整理了简历与博客中常用的Emoji表情符号分类汇总表,包含10大类100个常用Emoji。分类涵盖个人信息、工作经历、技能技术、项目成果、博客创作、时间状态、社交互动等场景,每个Emoji均标注代码和适用场景。使用建议:简历每章节1-2个&#x…...

永磁同步电机DPWM算法控制仿真Simulink模型探索

永磁同步电机DPWM算法控制仿真simulink模型。 邮箱发送。最近在研究永磁同步电机(PMSM)的控制算法,发现DPWM(Discontinuous Pulse Width Modulation,不连续脉宽调制)算法挺有意思,今天就来聊聊基…...

硕士论文3万字降AI率哪个好?一次通过知网检测的选择

硕士论文3万字降AI率哪个好?一次通过知网检测的选择 研二下学期开始写大论文的时候,我就隐约觉得AI检测会是个坎。等到初稿写完拿去预检,果然——知网报告上AI疑似率标了52%,导师看了直接说"这个不行,降到15%以下…...

本科毕业论文8000字降AI率用哪个好?预算50元以内的最佳方案

本科毕业论文8000字降AI率用哪个好?预算50元以内的最佳方案 上个月帮室友处理毕业论文的AI检测问题,她拿着知网的检测报告来找我,整篇8000字的论文AI疑似率标了47%,导师让她改到20%以下才给过。她问我:“网上那么多降…...

二次检测AI率反弹了怎么办?选对工具一次搞定

二次检测AI率反弹了怎么办?选对工具一次搞定 第一次检测AI率45%,用工具处理了一遍,自测降到了8%,松了口气。结果提交学校正式检测,出来一看——22%。 这种"AI率反弹"的情况,我在去年帮人处理论文…...

AI率从0降到负优化了?降AI过度的补救方案

AI率从0降到负优化了?降AI过度的补救方案 有个朋友上周找我吐槽,说他的论文用工具处理了三遍,AI率是降到3%了,可问题是——论文读起来像机器翻译的产物。导师看完初稿直接问他:“这论文是你写的吗?” 讽刺不…...

比迪丽模型在IDEA开发环境中的插件开发:AI辅助编程视觉化

比迪丽模型在IDEA开发环境中的插件开发:AI辅助编程视觉化 1. 引言 作为一名长期在开发工具领域工作的工程师,我一直在寻找能让编程更直观、更有趣的方法。最近尝试了将比迪丽AI绘画能力集成到IDEA中的插件开发,发现这不仅能提升开发效率&am…...

《淘宝双11同款:基于 Sentinel 的微服务流量防卫兵实战》

这个主题非常有含金量,结合了阿里巴巴的双11实战经验和微服务治理的核心组件——Sentinel(哨兵)。下面我将为你撰写一篇实战导向的技术文章:《淘宝双11同款:基于 Sentinel 的微服务流量防卫兵实战》,帮助你…...

《实战!用Scrapy+Flask构建京东商品比价微信机器人》

这个主题非常实用,结合了爬虫技术(Scrapy)、后端服务(Flask)和即时通讯工具(微信),非常适合用来构建一个自动化的商品价格监控系统。下面我将为你提供一个完整的实战指南&#xff0c…...

MKRWAN_v2库深度解析:工业级LoRaWAN终端固件驱动与协议栈集成

1. MKRWAN_v2 库深度解析:面向工业级LoRaWAN终端的固件驱动与协议栈集成指南1.1 库定位与工程价值MKRWAN_v2 是专为 Arduino MKR WAN 1300/1310 硬件平台设计的底层通信支持库,对应固件版本 1.3.1。该库并非简单的AT指令封装层,而是深度耦合S…...

Qwen3-32B-Chat入门指南:WebUI中Stream输出、Stop Token、Temperature调节说明

Qwen3-32B-Chat入门指南:WebUI中Stream输出、Stop Token、Temperature调节说明 1. 镜像概述与环境准备 1.1 镜像基本信息 本镜像为Qwen3-32B-Chat模型的私有部署优化版本,专为RTX 4090D 24GB显存显卡设计,主要特点包括: 硬件适…...

别再让程序动不动就崩溃了!Python异常处理,你该这么玩!

程序员与程序员的区别,往往就藏在这些“不起眼”的细节里在编程的世界里,有一句话很扎心:“代码写的再好,也扛不住用户的胡乱操作。”当你满怀信心地把程序交给用户,结果用户随意输入一个字母,你的程序瞬间…...

GPTK进阶指南:除了装游戏,这些Wine Prefix的维护技巧让你少走弯路

GPTK进阶指南:Wine Prefix管理与维护实战技巧 如果你已经成功用Game Porting Toolkit(GPTK)在Mac上运行了几款Windows游戏,可能会发现随着游戏数量的增加,环境变得越来越混乱——某个游戏的设置影响了其他游戏&#xf…...

Ubuntu系统dpkg依赖错误终极解决指南:从死循环到完全修复

Ubuntu系统dpkg依赖错误终极解决指南:从死循环到完全修复 当你正在Ubuntu系统上安装或更新软件包时,突然遇到"Unmet dependencies"错误提示,尝试运行apt --fix-broken install却陷入无限循环的报错中——这种场景对Linux用户来说无…...

电子秤设计避坑指南:用SIG24130实现24位ADC采集的5个关键技巧

电子秤设计避坑指南:用SIG24130实现24位ADC采集的5个关键技巧 在工业称重设备开发中,ADC(模数转换器)的选型与配置直接决定了系统的精度与稳定性。面对市场上琳琅满目的ADC芯片,如何选择一款既能满足高精度需求又具备成…...

Doris分区键设计翻车实录:用5个真实错误案例教你避雷Aggregate模型

Doris分区键设计实战:5个Aggregate模型避坑指南与优化策略 在广告点击分析、IoT设备监控等实时数仓场景中,Doris的Aggregate模型凭借其预聚合特性成为高频选择。但许多工程师在使用时,常陷入分区键设计的隐蔽陷阱——我曾见过一个日活千万的广…...

学Simulink——基于 Simulink 的 基于李雅普诺夫的稳定 DC-DC 控制器

目录 手把手教你学Simulink 一、引言:为什么需要李雅普诺夫方法设计 DC-DC 控制器? 二、Buck 变换器非线性模型回顾 三、李雅普诺夫控制器设计 A. 定义误差状态 B. 构造李雅普诺夫函数 C. 求导并强制负定 D. 设计控制律使 ( \dot{V} < 0 ) E. 改进:选择不同李雅普…...

零基础学基于Linux的NPU固件开发--1.3.3 零基础必知:Linux基础操作速览(终端、文件、权限、进程)

要理解“1.3.3 零基础必知:Linux基础操作速览(终端、文件、权限、进程)”,我们需要从“Linux的‘操作界面’和‘管理工具’”入手——就像“开车需要认仪表盘、换挡、踩油门”,Linux开发也需要掌握这些基础操作,才能顺利“指挥”系统完成固件开发。 对零基础读者来说,这…...

零基础学基于Linux的NPU固件开发​ 专栏--2.1.3 硬件连接:串口线、JTAG调试器、网线的用途

要理解“2.1.3 硬件连接:串口线、JTAG调试器、网线的用途”,核心是为零基础学习者明确“开发板与PC交互的物理桥梁”——这些线不是“多余的配件”,而是“调试、烧录、控制开发板的必备工具”。类比成“医生看病”:串口线是“听诊器”(听设备“心跳”),JTAG调试器是“手…...

零基础学基于Linux的NPU固件开发​ 专栏简介

目录 零基础学基于Linux的NPU固件开发​ 专栏简介 目标读者​ 专栏核心价值​ 学习路径​ 预期成果​ 专栏目录​ 前言:为什么学NPU固件开发?​ 第1章 基础概念扫盲:NPU、固件、Linux,到底啥关系?​ 1.1 什么是NPU?—— 给“AI计算”定制的“专用计算器” 1.2 什…...

GStreamer:中间件定位与架构深度解析

一、GStreamer的准确定位 1.1 中间件定义与GStreamer的位置 /*** brief 中间件定义与GStreamer定位分析* * 核心&#xff1a;GStreamer是**多媒体框架**&#xff0c;属于**应用层中间件*** * 中间件分类&#xff1a;* ┌──────────────────────────…...