news 2026/6/10 1:09:28

JavaScript正则表达式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript正则表达式

正则表达式一般用于模式匹配,搜索,替换等。

一、创建两种方式

// 字面量 const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; // 构造函数(模式可以动态生成) const searchTerm = "hello"; const dynamicRegex = new RegExp(`\\b${searchTerm}\\b`, 'gi');

二、flags标志的含义

粘性匹配:要求匹配必须从目标字符串的lastindex位置开始,要求连续匹配;成功时更新,失败时重置为0

三、常用模式语法

1、字符类

  • \d:数字[0-9]
  • \D:非数字
  • \w:数字字母下划线[a-zA-Z0-9_]
  • \W:非单词字符
  • \s:空白字符
  • \S:非空白字符
  • .:出换行外的任何字符
  • [a-z]:自定义字符类
  • [^a-z]:否定字符类

2、量词

  • a*:0个或多个a
  • a+:一个或多个a
  • a?:0个或一个a
  • a{3}:三个a
  • a{2,4}:2-4个a
  • a{2,}:至少两个a

3、锚点和边界

  • ^:字符串开始(^test)
  • $:字符串结束(test$)
  • \b:单词边界(\btest\b)
  • \B:非单词边界(\Btest\B)

4、分组和捕获

// 捕获组 const phoneRegex = /(\d{3})-(\d{3})-(\d{4})/; const match = phoneRegex.exec('123-456-7890'); console.log(match[0]); // 完整匹配: "123-456-7890" console.log(match[1]); // 第一组: "123" console.log(match[2]); // 第二组: "456" console.log(match[3]); // 第三组: "7890" // 非捕获组 (?:pattern) //非捕获组只能完整匹配,没有分组内容 const nonCapturing = /(?:https?:\/\/)([^\/]+)/; // 命名捕获组 (?<name>pattern) const namedGroup = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const dateMatch = namedGroup.exec('2023-12-25'); console.log(dateMatch.groups.year); // "2023" console.log(dateMatch.groups.month); // "12" console.log(dateMatch.groups.day); // "25"

5、断言

断言是正则表达式的特殊结构,用于检查某个位置是否符合条件,但不消耗字符。

特点:

  • 零宽:不占用匹配位置,只检查条件
  • 不消耗字符:匹配后指针留在原位置
  • 纯条件检查:只验证是否,不实际匹配内容
const text = "apple price: $10"; // 普通匹配 - 消耗字符 const normalRegex = /\$\d+/; console.log(text.match(normalRegex)); // ["$10"] // 匹配后指针移动到"0"后面 // 使用断言 - 不消耗字符 const lookaheadRegex = /(?<=\$)\d+/; console.log(text.match(lookaheadRegex)); // ["10"] // 断言(?<=\$)只检查前面是否有$,不匹配$

(1)断言类型

// 1. 正向肯定断言(正向预查)----------->匹配后面是...的位置
const positiveLookahead = /pattern(?=condition)/;

// 2. 正向否定断言(负向预查)----------->匹配后面不是...的位置
const negativeLookahead = /pattern(?!condition)/;

反向断言是ES2018新增加的,部分旧浏览器可能不支持

// 3. 反向肯定断言(正向回顾后发)----------->匹配前面是...的位置
const positiveLookbehind = /(?<=condition)pattern/;

// 4. 反向否定断言(负向回顾后发)----------->匹配前面不是...的位置
const negativeLookbehind = /(?<!condition)pattern/;

四、常用方法

1、String.prototype方法

(1)match()

功能:返回字符串正则表达式的结果

特点:包含g,返回所有匹配结果的数组;不包含g,返回第一个匹配结果及捕获组信息

// 无 g 标志 - 返回完整匹配信息 const str1 = '2023-12-25'; const result1 = str1.match(/(\d{4})-(\d{2})-(\d{2})/); console.log(result1); /* [ '2023-12-25', // 完整匹配 '2023', // 第一个捕获组 '12', // 第二个捕获组 '25', // 第三个捕获组 index: 0, // 匹配开始的索引 input: '2023-12-25', // 原始字符串 groups: undefined // 命名捕获组(如果有) ] */ // 有 g 标志 - 只返回匹配的文本数组 const str2 = 'test1 test2 test3'; const result2 = str2.match(/test\d/g); console.log(result2); // ['test1', 'test2', 'test3'] // 匹配失败 const result3 = str2.match(/abc/); console.log(result3); // null

(2)matchAll()

功能:返回一个迭代器,包含所有匹配结果及其捕获组

特点:必须使用g标志,否则会抛出错误;每个匹配都返回完整信息(包括捕获组,索引等);返回的是迭代器,所以可用Array.from()转换为数组

const emails = 'a@test.com, b@example.org, c@domain.net'; const emailRegex = /([a-z]+)@([a-z]+)\.([a-z]{2,})/gi; for (const match of emails.matchAll(emailRegex)) { console.log(`用户: ${match[1]}, 域名: ${match[2]}.${match[3]}`); }

(3)search()

功能:返回第一个匹配项的索引

特点:忽略g标志,总是返回第一个匹配位置。

const str = 'Hello World! Welcome to JavaScript.'; console.log(str.search(/World/)); // 6 console.log(str.search(/world/i)); // 6(忽略大小写) console.log(str.search(/javascript/i)); // 25 console.log(str.search(/Python/)); // -1 // 验证是否存在数字 if (str.search(/\d/) !== -1) { console.log('包含数字'); } else { console.log('不包含数字'); }

(4)replace()

功能:替换匹配的子字符串

特点:如果有g标志,替换所有匹配;如果无g标志,替换第一个匹配;替换字符串中可以包括特殊替换模式

// 基本替换 const str1 = 'Hello World World'; console.log(str1.replace(/World/, 'JavaScript')); // "Hello JavaScript World" console.log(str1.replace(/World/g, 'JavaScript')); // "Hello JavaScript JavaScript" // 使用捕获组 const str2 = 'John Smith'; console.log(str2.replace(/(\w+)\s(\w+)/, '$2, $1')); // "Smith, John" const str3 = '2023-12-25'; console.log(str3.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1')); // "25/12/2023" // 使用函数进行动态替换 const str4 = 'The price is $100 and $200'; const result = str4.replace(/\$(\d+)/g, (match, amount) => { return `$${parseInt(amount) * 1.1}`; // 涨价10% }); console.log(result); // "The price is $110 and $220" // 命名捕获组 const str5 = 'User: john_doe, Age: 30'; console.log( str5.replace( /User: (?<username>\w+), Age: (?<age>\d+)/, '用户名: $<username>, 年龄: $<age>' ) ); // "用户名: john_doe, 年龄: 30" // 更复杂的函数替换 const html = '<div class="old">内容</div>'; const newHtml = html.replace( /<(\w+)([^>]*)>/g, (match, tagName, attributes) => { return `<${tagName}${attributes}>const str = 'a b c a b c'; // 使用字符串模式 console.log(str.replaceAll('a', 'x')); // "x b c x b c" // 使用正则表达式(必须有 g 标志) console.log(str.replaceAll(/[abc]/g, 'x')); // "x x x x x x" // 会抛出错误,因为缺少 g 标志 try { str.replaceAll(/[abc]/, 'x'); } catch (e) { console.log(e.message); // "replaceAll must be called with a global RegExp" } // 使用函数 const result = str.replaceAll(/[abc]/g, (match) => { return match.toUpperCase(); }); console.log(result); // "A B C A B C"

(6)split()

功能:使用正则表达式分割字符串

特点:如果正则包含捕获组,捕获组的内容也会包含在结果数组中;可以限制返回的数组长度。

// 基本分割 const str1 = 'a,b,c'; console.log(str1.split(/,/)); // ['a', 'b', 'c'] // 包含捕获组 const str2 = 'a,b,c'; console.log(str2.split(/(,)/)); // ['a', ',', 'b', ',', 'c'] // 复杂分割 const str3 = 'Hello, World! Welcome to JavaScript.'; console.log(str3.split(/[,\s!]+/)); // ['Hello', 'World', 'Welcome', 'to', 'JavaScript', ''] // 限制返回长度 const str4 = 'a,b,c,d,e'; console.log(str4.split(/,/, 3)); // ['a', 'b', 'c'] // 提取特定部分 const logLine = '2023-12-25 10:30:15 INFO User logged in'; const parts = logLine.split(/\s+/); console.log({ date: parts[0], time: parts[1], level: parts[2], message: parts.slice(3).join(' ') }); // { date: '2023-12-25', time: '10:30:15', level: 'INFO', message: 'User logged in' }

2、RegExp方法

(1)test()

功能:测试字符串是否匹配正则表达式

特点:如果正则中包含g标志,会更新lastindex属性

// 基本用法 const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; console.log(emailRegex.test('test@example.com')); // true console.log(emailRegex.test('invalid-email')); // false // 包含 g 标志时的行为 const regex = /test/g; const str = 'test test test'; console.log(regex.test(str)); // true console.log(regex.lastIndex); // 4 console.log(regex.test(str)); // true console.log(regex.lastIndex); // 9 console.log(regex.test(str)); // true console.log(regex.lastIndex); // 14 console.log(regex.test(str)); // false console.log(regex.lastIndex); // 0(重置) // 重置 lastIndex regex.lastIndex = 0; // 实用验证函数 function validateInput(input, regex) { if (!regex.test(input)) { console.log(`验证失败: ${input}`); return false; } return true; } const phoneRegex = /^1[3-9]\d{9}$/; console.log(validateInput('13800138000', phoneRegex)); // true console.log(validateInput('123456', phoneRegex)); // false

(2)exec()

功能:执行正则表达式匹配,返回详细信息

特点:没有g标志,总返回第一个匹配;有g每次调用返回下一个匹配,直到返回null;返回结果包含完整匹配信息;比match灵活。

// 无 g 标志 const regex1 = /(\d{4})-(\d{2})-(\d{2})/; const result1 = regex1.exec('今天是2023-12-25'); console.log(result1); /* [ '2023-12-25', '2023', '12', '25', index: 3, input: '今天是2023-12-25', groups: undefined ] */ // 有 g 标志,遍历所有匹配 const regex2 = /\b\w+\b/g; const str = 'Hello World JavaScript'; let match; while ((match = regex2.exec(str)) !== null) { console.log(`找到 "${match[0]}" 在位置 ${match.index}`); console.log(`下次搜索从位置 ${regex2.lastIndex} 开始`); } // 输出: // 找到 "Hello" 在位置 0 // 下次搜索从位置 5 开始 // 找到 "World" 在位置 6 // 下次搜索从位置 11 开始 // 找到 "JavaScript" 在位置 12 // 下次搜索从位置 22 开始 // 使用命名捕获组 const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const dateMatch = dateRegex.exec('2023-12-25'); console.log(dateMatch.groups.year); // "2023" console.log(dateMatch.groups.month); // "12" console.log(dateMatch.groups.day); // "25" // 解析复杂结构 const logRegex = /(\d{4}-\d{2}-\d{2})\s(\d{2}:\d{2}:\d{2})\s(\w+)\s(.+)/; const logLine = '2023-12-25 10:30:15 ERROR Database connection failed'; const logMatch = logRegex.exec(logLine); if (logMatch) { console.log({ timestamp: `${logMatch[1]} ${logMatch[2]}`, level: logMatch[3], message: logMatch[4] }); }

3、总结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:21:59

空洞骑士模组管理器Scarab:5分钟快速上手指南

空洞骑士模组管理器Scarab&#xff1a;5分钟快速上手指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为《空洞骑士》模组安装的繁琐流程而烦恼吗&#xff1f;Scarab模…

作者头像 李华
网站建设 2026/6/10 13:44:40

XGBoost极速安装全平台配置指南

XGBoost极速安装全平台配置指南 【免费下载链接】xgboost dmlc/xgboost: 是一个高效的的机器学习算法库&#xff0c;基于 C 开发&#xff0c;提供用于提升分类、回归、排序等任务的性能。 项目地址: https://gitcode.com/gh_mirrors/xg/xgboost 想要快速上手XGBoost机器…

作者头像 李华
网站建设 2026/6/10 9:15:03

ZSTD压缩算法简单测试

背景特性维度Zlib (DEFLATE)Zstd (Zstandard)核心算法LZ77 霍夫曼编码 (诞生于1990年代)现代LZ变体 有限状态熵/tANS (第一版于FaceBook公司发布2016)设计哲学寻求压缩率与速度的平衡&#xff0c;侧重于高压缩率。首要追求速度&#xff08;尤其是解压速度&#xff09;&#x…

作者头像 李华
网站建设 2026/6/10 11:33:39

【计算机毕业设计案例】基于python-CNN深度学习对宠物体型识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 13:36:03

一篇文章说透FunctionCall,MCP和Skill

关于大模型生态中新出现的“Skill”&#xff08;技能&#xff09;&#xff0c;核心指的是Anthropic为其Claude模型推出的 “Claude Skills”。你可以将其理解为一种模块化、可复用的AI能力扩展包&#xff0c;它让AI从一个“会聊天的助手”升级为能自动化执行专业任务的“打工人…

作者头像 李华