JavaScript中的正则表达式:文本处理的瑞士军刀
JavaScript中的正则表达式:文本处理的瑞士军刀
在编程世界中,正则表达式(Regular Expression,简称RegExp)被誉为“文本处理的瑞士军刀”。它能够高效地完成字符串匹配、替换、提取和验证等任务。无论是前端开发中的表单验证,还是后端数据清洗,正则表达式都扮演着不可或缺的角色。本文将带你深入浅出地了解JavaScript中的正则表达式,从基础语法到高级技巧,助你掌握这一强大工具。
一、正则表达式的“身份证”:创建方式
在JavaScript中,正则表达式可以通过两种方式创建:
1. 字面量方式
字面量方式是最直观的创建方式,使用斜杠 /
包裹模式,并附加标志(flags):
const regex1 = /pattern/flags;
- pattern:定义匹配规则,例如
/abc/
表示匹配字符串 “abc”。 - flags:控制匹配行为,常见的标志包括:
g
(全局匹配):匹配所有符合条件的内容。i
(忽略大小写):匹配时不区分大小写。m
(多行匹配):将输入字符串视为多行文本。
示例:
const regex = /\d+/g; // 匹配所有数字
console.log("123abc456".match(regex)); // 输出 ["123", "456"]
2. 构造函数方式
通过 RegExp
构造函数动态创建正则表达式,适用于需要动态拼接模式的场景:
const regex2 = new RegExp('pattern', 'flags');
注意:构造函数中,特殊字符需要双重转义(如 \d
需要写成 \\d
)。
示例:
const pattern = "\\d+"; // 匹配数字
const flags = "g";
const regex = new RegExp(pattern, flags);
console.log("123abc456".match(regex)); // 输出 ["123", "456"]
二、正则表达式的核心语法:规则的“密码本”
1. 元字符:赋予正则表达式“魔法”的符号
元字符是正则表达式中具有特殊含义的符号,它们能显著提升匹配的灵活性。以下是一些常见元字符:
.
:匹配除换行符外的任意单个字符。*
:匹配前一个元素 0次或多次。+
:匹配前一个元素 1次或多次。?
:匹配前一个元素 0次或1次。^
:匹配字符串的开头。$
:匹配字符串的结尾。\d
:匹配任意数字(等价于[0-9]
)。\w
:匹配字母、数字或下划线(等价于[a-zA-Z0-9_]
)。\s
:匹配任意空白字符(空格、制表符、换行符等)。
示例:
// 匹配以 "http" 开头、以 ".com" 结尾的字符串
const urlRegex = /^http.*\.com$/;
console.log(urlRegex.test("https://example.com")); // true
2. 量词:控制匹配次数的“节拍器”
量词用于定义某个模式出现的次数,是正则表达式中最强大的工具之一:
语法 | 含义 |
---|---|
{n} | 恰好匹配 n 次 |
{n,} | 至少匹配 n 次 |
{n,m} | 匹配 n 到 m 次 |
* | 等价于 {0,} |
+ | 等价于 {1,} |
? | 等价于 {0,1} |
示例:
// 匹配 5~10 位数字
const phoneRegex = /^\d{5,10}$/;
console.log(phoneRegex.test("123456")); // true
3. 字符类:定义“选项菜单”的快捷方式
字符类使用方括号 []
包裹,表示匹配其中任意一个字符:
[abc]
:匹配a
、b
或c
。[a-z]
:匹配任意小写字母。[^a-z]
:匹配非小写字母的字符(^
表示取反)。[0-9A-F]
:匹配十六进制数字。
示例:
// 匹配 RGB 颜色代码(如 #FF0000)
const colorRegex = /^#[0-9A-Fa-f]{6}$/;
console.log(colorRegex.test("#123ABC")); // true
4. 分组与捕获:提取信息的“集装箱”
使用圆括号 ()
对模式分组,不仅能增强匹配逻辑,还能捕获匹配到的子串:
- 捕获组:通过
$1
、$2
等引用匹配内容。 - 非捕获组:使用
(?:...)
表示仅分组,不捕获。
示例:
// 提取日期中的年月日
const dateRegex = /(\d{4})-(\d{2})-(\d{2})/;
const match = dateRegex.exec("2025-06-04");
console.log(match[1], match[2], match[3]); // 输出 2025 06 04
5. 边界匹配:定位文本的“坐标系”
边界匹配符帮助我们精准定位字符串的开始、结束或单词边界:
^
:匹配字符串的开头。$
:匹配字符串的结尾。\b
:匹配单词边界(如空格或标点)。\B
:匹配非单词边界。
示例:
// 验证邮箱格式(简单版)
const emailRegex = /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/;
console.log(emailRegex.test("user@example.com")); // true
三、高级技巧:正则表达式的“超能力”
1. 贪婪与非贪婪匹配
正则表达式默认是贪婪匹配(尽可能多地匹配字符),可以通过 ?
改为非贪婪匹配(尽可能少地匹配)。
示例:
const text = "<div><span>Hello</span></div>";
const greedyRegex = /<.*>/; // 贪婪匹配
const nonGreedyRegex = /<.*?>/; // 非贪婪匹配
console.log(greedyRegex.exec(text)[0]); // 整个字符串
console.log(nonGreedyRegex.exec(text)[0]); // 第一个 <div>
2. 预查(Lookaround):条件匹配的“隐形眼镜”
预查允许我们检查某个位置是否满足条件,而不消耗字符:
- 正向预查:
(?=...)
(匹配后面必须满足的条件)。 - 负向预查:
(?!...)
(匹配后面不能满足的条件)。 - 正向后顾:
(?<=...)
(匹配前面必须满足的条件)。 - 负向后顾:
(?<!...)
(匹配前面不能满足的条件)。
示例:
// 匹配后面跟着 "px" 的数字
const pxRegex = /\d+(?=px)/;
console.log(pxRegex.exec("100px 200em")); // 输出 ["100"]
3. 命名捕获组:让结果更易读
在ES2018中,可以通过 ?<name>
为捕获组命名,提升代码可读性:
示例:
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = dateRegex.exec("2025-06-04");
console.log(match.groups.year); // 输出 "2025"
四、实战场景:正则表达式的“用武之地”
1. 表单验证
正则表达式是表单验证的利器,可以快速判断用户输入是否符合预期格式:
// 验证手机号(中国手机号格式)
const phoneRegex = /^1[3-9]\d{9}$/;
function validatePhone(input) {return phoneRegex.test(input);
}
2. 数据提取
从文本中提取关键信息(如日志分析、爬虫):
// 提取 HTML 标签中的内容
const htmlRegex = /<(\w+)>(.*?)<\/\1>/g;
let match;
while ((match = htmlRegex.exec("<div>Hello</div>")) !== null) {console.log(`标签: ${match[1]}, 内容: ${match[2]}`);
}
3. 文本替换
通过 replace()
方法实现复杂的替换逻辑:
// 将所有 "JavaScript" 替换为 "JS"
const text = "JavaScript is awesome! Learn JavaScript.";
const replacedText = text.replace(/JavaScript/g, "JS");
console.log(replacedText); // "JS is awesome! Learn JS."
五、注意事项:避免“踩坑”的指南针
-
性能问题
复杂的正则表达式可能导致性能问题,尤其是涉及大量回溯时。建议通过非贪婪匹配、减少嵌套等方式优化。 -
安全性
在处理用户输入时,避免直接使用用户输入构建正则表达式,防止正则表达式注入攻击。 -
可读性
复杂的正则表达式难以维护。可以通过注释、拆分逻辑或使用工具(如 Regex101)进行调试。
六、结语:从入门到精通的阶梯
正则表达式是文本处理的强大工具,但它的学习曲线较为陡峭。掌握基础语法后,建议通过实际项目不断练习,并借助在线工具(如 RegExr)进行调试和优化。随着熟练度的提升,你会发现正则表达式不仅能解决日常问题,还能成为你代码中的“优雅解法”。
最后送大家一句话:
“正则表达式是一门艺术,也是开发者必备的技能之一。实践是掌握它的最佳途径!”
希望这篇文章能为你打开正则表达式的大门,未来在代码中游刃有余!
相关文章:
JavaScript中的正则表达式:文本处理的瑞士军刀
JavaScript中的正则表达式:文本处理的瑞士军刀 在编程世界中,正则表达式(Regular Expression,简称RegExp)被誉为“文本处理的瑞士军刀”。它能够高效地完成字符串匹配、替换、提取和验证等任务。无论是前端开发中的表…...
vue对axios的封装和使用
在 Vue 项目中,使用 axios 进行 HTTP 请求是非常常见的做法。为了提高代码的可维护性、统一错误处理和请求拦截/响应拦截逻辑,对axios进行封装使用。 一、基础封装(适用于 Vue 2 / Vue 3) 1. 安装 axios npm install axios2. 创…...
软考 系统架构设计师系列知识点之杂项集萃(82)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(81) 第148题 “41”视图主要用于描述系统逻辑架构,最早由Philippe Kruchten于1995年提出。其中( )视图用于描述对象模型,并说明系统应该…...
DrissionPage调试工具:网页自动化与数据采集的革新利器
在网页自动化测试与数据采集领域,开发者长期面临两难选择:使用Selenium等工具操作浏览器时效率不足,而直接调用Requests库又难以应对复杂动态页面。DrissionPage的出现完美解决了这一矛盾,这款基于Python开发的工具创新性地将浏览…...

有人-无人(人机)交互记忆、共享心智模型与AI准确率的边际提升
有人-无人(人机)交互记忆、共享心智模型与AI准确率的边际提升是人工智能发展中相互关联且各有侧重的三个方面。人机交互记忆通过记录和理解用户与机器之间的交互历史,增强机器对用户需求的个性化响应能力,从而提升用户体验和协作效…...
如何使用k8s安装redis呢
在Kubernetes (k8s) 上安装Redis 在Kubernetes上安装Redis有几种方法,下面我将介绍两种常见的方式:使用StatefulSet直接部署和使用Helm chart部署。 一、安装redis 1.1 拉去ARM镜像(7.4.2) docker pull registry.cn-hangzhou.ali…...
AI对测试行业的应用
AI对测试行业的应用 AI技术在软件测试领域的应用已从概念验证全面迈向工程化落地,正在重构测试流程、提升效率边界,并为质量保障体系带来范式级变革。以下从技术突破、行业实践与未来趋势三个维度展开深度解析: ⚙️ 一、核心技术突破&#…...

【OpenGL学习】(五)自定义着色器类
文章目录 【OpenGL学习】(五)自定义着色器类着色器类插值着色统一着色 【OpenGL学习】(五)自定义着色器类 项目结构: 着色器类 // shader_s.h #ifndef SHADER_H #define SHADER_H#include <glad/glad.h>#inc…...

408第一季 - 数据结构 - 栈与队列的应用
括号匹配 用瞪眼法就可以知道的东西 栈在表达式求值运用 先简单看看就行,题目做了就理解了 AB是操作符,也是被狠狠加入后缀表达式了,然后后面就是*,只要优先级比栈顶运算符牛逼就放里面,很显然,*比牛逼 继续前进&#…...

超声波清洗设备的清洗效果如何?
超声波清洗设备是一种常用于清洗各种物体的技术,它通过超声波振荡产生的微小气泡在液体中破裂的过程来产生高能量的冲击波,这些冲击波可以有效地去除表面和细微裂缝中的污垢、油脂、污染物和杂质。超声波清洗设备在多个领域得到广泛应用,包括…...
k8s部署dify
以前部署过,最近重新部署发现还是存在很多问题,这里进行记录 1.基础配置内容 配置信息和账号密码 # dify-deployment.yaml--- # Namespace apiVersion: v1 kind: Namespace metadata:name: dify-min--- # ConfigMap for shared environment variables…...

“草台班子”的成长路径分析
一、草台班子的起点:用最小成本验证价值 特点: 团队规模小(通常3-5人),成员背景杂(可能是程序员产品经理运营的混搭);资源匮乏(无资金、无技术中台、无客户积累&#x…...
RAG技术解析:实现高精度大语言模型知识增强
RAG技术解析:实现高精度大语言模型知识增强 RAG概述 RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合检索系统和生成模型的技术架构,旨在提高大语言模型回答问题的准确性和相关性。当遇到如"如何退…...

软件测评服务如何依据标准确保品质?涵盖哪些常见内容?
软件测评服务涉及对软件的功能和性能等多维度进行评估和检验,这一过程有助于确保软件的品质,降低故障发生率及维护费用,对于软件开发和维护环节具有至关重要的价值。 测评标准依据 GB/T 25000.51 - 2016是软件测评的核心依据。依照这一标准…...
大数据学习(131)-Hive数据分析函数总结
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
SCAU数值计算OJ
18957.计算自然对数ln(x)的导数 Description 求自然对数ln(x)的导数,输入双精度实数x>1,输出自然对数ln(x)的导数(精确到小数点后2位有效数,小数点后第2位四舍五入所得)。输入格式 m(整数,实验数据总…...
c++ 基于openssl MD5用法
基于openssl MD5用法 #include <iostream> #include <openssl/md5.h> using namespace std; int main(int argc, char* argv[]) { cout << "Test Hash!" << endl; unsigned char data[] "测试md5数据"; unsigned char out[1024…...

Python打卡第46天
浙大疏锦行 注意力 注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景,聚焦于图片中的主体(如猫、汽车)。 从数学角度看,注意力机制是对输入特征进行加权求和,…...

Unity优化篇之DrawCall
当然可以!以下是完整、详尽、可发布的博客文章,专注讲解 Unity 的静态合批与动态合批机制,并详细列出它们对 Shader 的要求和所有限制条件。文章结构清晰、技术深度足够,适合发布在 CSDN、掘金、知乎等技术平台。 urp默认隐藏动态…...

SpringCloud学习笔记-2
说明:来源于网络,如有侵权请联系我删除 1.提问:如果注册中心宕机,远程调用还能成功吗 答:当微服务发起请求时,会向注册中心请求所有的微服务地址,然后在向指定的微服务地址发起请求。在设计实…...
C++.OpenGL (9/64)复习(Review)
复习(Review) 核心概念快速回顾 #mermaid-svg-MMSQf7gXQlHqiqfM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MMSQf7gXQlHqiqfM .error-icon{fill:#552222;}#mermaid-svg-MMSQf7gXQlHqiqfM .error-text{fill:#…...
Spring Boot-面试题(52)
摘要: 1、通俗易懂,适合小白 2、仅做面试复习用,部分来源网络,博文免费,知识无价,侵权请联系! 1. 什么是 Spring Boot 框架? Spring Boot 是基于 Spring 框架的快速开发框架&#…...

从混乱到秩序:探索管理系统如何彻底改变工作流程
内容摘要 在许多企业与组织中,工作流程混乱是阻碍发展的“绊脚石”。员工们常常被繁琐的步骤、模糊的职责和沟通不畅等问题搞得焦头烂额,工作效率低下,错误频发。而与之形成鲜明对比的是,一些引入了先进管理系统的团队࿰…...

最新研究揭示云端大语言模型防护机制的成效与缺陷
一项全面新研究揭露了主流云端大语言模型(LLM)平台安全机制存在重大漏洞与不一致性,对当前人工智能安全基础设施现状敲响警钟。该研究评估了三大领先生成式AI平台的内容过滤和提示注入防御效果,揭示了安全措施在阻止有害内容生成与…...

HTML5+CSS3+JS小实例:具有粘性重力的磨砂玻璃导航栏
实例:具有粘性重力的磨砂玻璃导航栏 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width…...
CVAT标注服务
CVAT 是一个交互式的视频和图像标注工具,适用于计算机视觉,是一个典型的现代Web应用架构,可以实现大部分情况的标注工作,可以通过serveless CVAT-github cvat文档 下面将就其配置介绍一下几个服务: 1. 核心服务 (C…...
SpringBoot+Mybatisplus配置多数据源(超级简单!!!!)
今天分享配置多数据源的另外一种方式,SpringBoMybatisplus配置多数据源,此种方式配置相对简单,都是苞米豆封装好的,配置容易;此篇分享比较简单的方式配置数据源,多个固定的数据源,通过注解选择使…...
Git Svn
github一般需要科学上网,通过SourceTree通过URL克隆,会提示无效URL或者SLL Timeout之类,如果电脑开启了VPN,在系统设置-网络-DNS查看代理端口,如:127.0.0.1:7890 手动配置git代理 git config --global ht…...

Python爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

Webpack的基本使用 - babel
Mode配置 Mode配置选项可以告知Webpack使用相应模式的内置优化 默认值是production(什么都不设置的情况下) 可选值有:none | development | production; 这几个选项有什么区别呢? 认识source-map 我们的代码通常运行在浏览器…...