分享二个实用正则

news/2025/10/25 20:58:26/文章来源:https://www.cnblogs.com/xwwin/p/19160556

前言

正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配和操作文本的强大工具。它由一系列字符和特殊字符(称为元字符)组成,用于描述要匹配的文本模式。正则表达式可以在文本中查找、替换、提取和验证特定的模式
最近看到二个我觉得很实用的正则使用方式,特写文章记录下来

数字千分位处理

功能:把数字1234567转为1,234,567
代码如下:

/*** 数字千分位处理(对于非数字返回null)* @param {number} value - 需要进行千分位格式化的数字* @returns {string | null} - 千分位格式化后的结果*/
function formatNumber(value) {if (isNaN(value)) return null;// 先将数字转为字符串,并分割整数和小数部分const [integerPart, decimalPart] = `${value}`.split('.');// 只对整数部分添加千位分隔符const formattedInteger = integerPart.replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, "$1,");// 如果有小数部分,重新组合return decimalPart ? `${formattedInteger}.${decimalPart}` : formattedInteger;
}

正则表达式分解:

  • (\d) - 捕获组1:匹配任意一个数字
  • (?=...) - 正向预查:匹配后面跟特定内容的位置
  • (\d\d\d)+ - 捕获组2:匹配3个数字,可以重复一次或多次
  • (?!\d) - 负向预查:确保后面没有其他数字
  • /g - 全局匹配标志

工作原理:

让我们用一个具体例子来说明,比如数字 "1234567":
分析正则匹配过程:

a. 第一次匹配:

* (\\d) 匹配到 "1"
* (?=(\\d\\d\\d)+(?!\\d)) 向前预查:
发现后面有 "234567"
符合 (\\d\\d\\d)+ 模式("234" 和 "567")
最后一位后面没有数字((?!\\d))
匹配成功,替换为 "1,"

b. 失败的匹配:

* 逗号后继续
* (\\d) 匹配到 "2"
* 向前预查发现后面是 "34567"
* 符合 (\\d\\d\\d)+ 模式("345")
* 但后面还有 "67",不符合 (?!\\d)
* 匹配失败

c. 成功的匹配:

* 继续向前
* (\\d) 匹配到 "4"
* 向前预查发现后面是 "567"
* 符合 (\\d\\d\\d)+ 模式
* 最后一位后面没有数字
* 匹配成功,替换为 "4,"
* 最终结果:
* 原始数字 "1234567" → "1,234,567"

依次把所有数字匹配完成
限制条件:

不处理小数部分
不处理负号
只在正确的千分位位置添加逗号
不会在数字开头添加逗号

强密码验证

在做用户登录/注册的时候,有的要求用户的账号密码必须是强密码,如必须是有大小写字母数字加特殊字符
代码如下:

/*** 验证密码(所有验证逻辑整合到单个正则中)* @param {string} password - 需要验证的密码* @param {number} [minLength=8] - 最小长度* @param {number} [maxLength=32] - 最大长度* @param {string} [allowedSpecials='!@#$%^&*()'] - 允许的特殊字符集合* @returns {Object} - 验证结果和错误信息*/
function validatePassword(password,minLength = 8,maxLength = 32,allowedSpecials = '!@#$%^&*()'
) {const errors = [];// 特殊字符转义(处理正则元字符)const escapedSpecials = allowedSpecials.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&');// 整合长度验证的正则表达式// 核心:在原正则基础上添加长度限制 {minLength, maxLength}const regex = new RegExp(`^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)(?=.*[${escapedSpecials}]).{${minLength},${maxLength}}$`);if (!regex.test(password)) {// 长度错误检查if (password.length < minLength) {errors.push(`密码长度不能少于${minLength}个字符`);}if (password.length > maxLength) {errors.push(`密码长度不能超过${maxLength}个字符`);}// 字符类型错误检查if (!/[a-z]/.test(password)) errors.push("必须包含至少一个小写字母");if (!/[A-Z]/.test(password)) errors.push("必须包含至少一个大写字母");if (!/\\d/.test(password)) errors.push("必须包含至少一个数字");if (!new RegExp(`[${escapedSpecials}]`).test(password)) {errors.push(`必须包含至少一个特殊字符(允许的字符:${allowedSpecials})`);}}return {isValid: errors.length === 0,errors: errors};
}
  • 特殊字符转义,处理 allowedSpecials

    作用:将 allowedSpecials 中包含的「正则元字符」(如 *、(、$ 等)转义为普通字符(如 * → *),避免破坏正则语法。

    例如:若 allowedSpecials 是 '$()',转义后变为 '$()'(字符串中显示为 $*())。

const escapedSpecials = allowedSpecials.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&');
  • 核心正则表达式详解
    这里用 new RegExp() 动态生成正则,将转义后的特殊字符(escapedSpecials)和密码长度验证嵌入正则中。
    假设 allowedSpecials 是默认的 '!@#$%^&*()',转义后 escapedSpecials 为 '!@#$%^&*()',假设minLength为8,maxLength为32,则生成的正则字符串为:

    ^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#\\$%\\^&\\*\\(\\)]).{8,32}$
    

    这是一个包含4 个正向预查的正则,用于强制要求密码同时满足多种字符类型。我们逐个拆解:

    正则部分 含义解释
    ^ 匹配字符串的开始位置(确保从开头就检查,避免只匹配部分字符串)。
    (?=.*[a-z]) 正向预查:确保字符串中至少有一个小写字母([a-z])。
    - .* 表示任意字符(除换行)重复任意次(包括 0 次)。
    - 整体含义:“从当前位置开始,后面存在至少一个小写字母”。
    (?=.*[A-Z]) 正向预查:确保字符串中至少有一个大写字母([A-Z])。
    (?=.*\\d) 正向预查:确保字符串中至少有一个数字(\\d 等价于 [0-9])。
    (?=.*[!@#$%^&*()]) 正向预查:确保字符串中至少有一个允许的特殊字符(即 allowedSpecials 中指定的字符)。
    .{8,32} 表示 “匹配任意字符(除换行),且长度在 minLength 到 maxLength 之间
    $ 匹配字符串的结束位置(确保检查到字符串末尾,避免遗漏)。

小结

正则又叫火星文,它的用法千千万,个人知识有限,如果你有一些更好的正则好用的方式,欢迎留言分享,一起学习一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国际水稻研究所推出 AI 驱动的全球杂交水稻育种与亲本筛选数字平台

菲律宾洛斯巴诺斯(2025 年 2 月 26 日)——国际水稻研究所(IRRI)正式发布全新 AI 驱动数字平台,可显著加速全球杂交水稻育种与亲本筛选工作,通过推广高产且气候智能型杂交水稻,为粮食安全与可持续农业作出贡献。…

《程序员修炼之道:从小工到专家》笔记1

1核心身份认同:本书开篇即定义了“注重实效的程序员”的形象。我们不仅是代码的搬运工,更是项目的看护人和利益的守护者。我们勇于承担责任,而不是找借口。 2两大核心哲学: “我的源码让猫给吃了”:这是一种反讽。…

深入解析:UNIX下C语言编程与实践3-Vi 编辑器从入门到精通:快捷键使用与高效编辑技巧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

科普报告:分子标记辅助选择(MAS)育种

分享一则由埃及农业基因工程研究所(AGERI)的Dina El-Khishin教授撰写《Marker Assisted Selection(MAS,标记辅助选择)》的报告,系统介绍了分子标记在植物育种中的应用,特别是如何利用MAS技术应对气候变化背景下…

实用指南:【ansible/K8s】K8s的自动化部署源码分享

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF1896F

题目大意: 有一个长度为 \(2n\) 的 \(01\) 序列 \(a\),你可以对他进行一下操作(不超过10步)。 输出一个长度为 \(2n\) 的括号匹配字符串 \(s\),假设每个左括号 \(i\) 与右括号 \(p_{i}\) 匹配,那么将 \(a\) 中 \…

作物遗传育种中的多亲本互交群体(MAGIC)

MAGIC群体简介 植物遗传研究的重要优势是遗传群体构建的便利。传统上用于遗传作图的主要有基于连锁分析的双亲群体和基于关联分析的自然群体和多亲群体。但由于双亲群体的遗传背景狭窄,可定位的 QTL 有限,自然群体存…

联邦大型语言模型、多智能体大型语言模型是什么? - 详解

联邦大型语言模型、多智能体大型语言模型是什么? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

一个用于自动化基因表达分析的多智能体框架GenoMAS

2025年7月,伊利诺伊大学香槟分校和加州大学圣地亚哥分校的研究团队在预印本平台arXiv发表了题为GenoMAS: A Multi-Agent Framework for Scientific Discovery via Code-Driven Gene Expression Analysis的论文。该研究…

50年的玉米育种改良,是如何应对气候变化的?

分享一篇来自布宜诺斯艾利斯大学今年发表的综述文章《50 years of breeding to improve yield: how maize stands up to climate change》,该文回顾了过去50年玉米育种在提高产量方面的成就,分析了这些改良如何帮助玉…

刷题日记—洛谷数组题单—幻方

幻方如图 题目要求输入n,构建一个nn的幻方,很显然是一个二维数组,但是要怎么插入呢?插入必然要用到循环。是for还是while? 由题目条件可知,幻方的数值是从1——nn,并且第一个数的位置已经确定,而第X个数是由X—…

python爬虫进阶版练习(只说重点,selenium) - 指南

python爬虫进阶版练习(只说重点,selenium) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

基因组选择(GS)如何加速作物遗传增益?

分享一则 来自Violina Bharali 博士课程报告——《Accelerating crop genetic gains with genomic selection》 。基因组选择通过“全基因组预测 + 快速世代 + 高通量数据”三重加速,让作物育种从“马拉松”变成“接力…

AI巨头动态:从OpenAI收购到Meta裁员,我们看到了什么?

最近科技圈真是热闹非凡,OpenAI和Meta这两大AI巨头接连爆出大新闻,让我这个学软件工程的不禁思考:这些事件背后,到底隐藏着哪些技术趋势和职业启示?先说说OpenAI收购SAI这件事。他们居然盯上了macOS供应商,还计划…

Nature Plants | 植物转录因子结合图谱,360个转录因子的近3000个全基因组结合位点图谱

转录因子 (TFs) 是通过结合 DNA 来控制基因表达时空定位的蛋白质。在植物中,数十个 TF 家族与不同的结合位点 (TFBSs) 集合相互作用,这些位点反映了每个 TF 在生物体功能和物种特异性适应中的作用。然而,定义这些作…

【大数据】水质数据可视化分析实用的系统 计算机工程 Hadoop+Spark环境配置 数据科学与大信息技术 附源码+文档+讲解

【大数据】水质数据可视化分析实用的系统 计算机工程 Hadoop+Spark环境配置 数据科学与大信息技术 附源码+文档+讲解2025-10-25 20:34 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; wor…

【MyBatis】MyBatis 报错:Parameter ‘xxx‘ not found - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:3. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--从业务到方案:消费类目智能匹配的整体设计

深入解析:3. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--从业务到方案:消费类目智能匹配的整体设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

xyd 2025 S 模拟赛

8 + 100 + 50 + 55 = 213, Rank 15/323.是怎么注意到 \(x^{2^k} \bmod 998244353\) 关于 \(k\) 有循环节的啊喂 /dk2025CSP-S第二轮(复赛)模拟赛 链接:link 题解:link 时间:4h (2025.10.25 14:30~18:30) 题目数:…

标题:AI巨头动态:从OpenAI的野心到Meta的裁员潮

标签:人工智能, 科技新闻, 就业趋势, 行业观察最近关注了一些科技新闻,发现AI领域真是风云变幻,既有像OpenAI这样的公司不断扩张,又有Meta那边传出裁员消息,让人不禁思考这个行业的发展方向。先说说OpenAI吧,他们…