信息发布→ 登录 注册 退出

JavaScript正则表达式是什么_如何用它匹配文本

发布时间:2026-01-12

点击量:
JavaScript正则表达式是内建工具,可用字面量(/pattern/)或RegExp构造函数创建;静态模式用字面量,动态拼接用new RegExp()并注意双重转义;match()与exec()行为不同,replace()支持$1等捕获组引用。

JavaScript 正则表达式是内建的文本匹配与操作工具,不是额外库,直接用 RegExp 构造函数或字面量(如 /abc/)创建,所有字符串方法(match()replace()test() 等)都原生支持它。

正则字面量 vs new RegExp():什么时候该用哪个

字面量(/pattern/flags)写法简洁,适合静态模式;new RegExp() 适合动态拼接——比如从用户输入或变量中构建正则。但要注意:new RegExp("a.b") 中的点号会被 JS 字符串先转义一次,必须写成 "a\\.b" 才等价于字面量 /a\.b/

  • 固定规则(如邮箱基础校验)→ 用 /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  • 搜索高亮关键词 → 拼接变量时用 new RegExp(escapeRegExp(keyword), "gi"),其中 escapeRegExp() 需手动实现转义特殊字符
  • 标志位 g(全局)、i(忽略大小写)、m(多行)只能在字面量末尾或构造函数第二个参数传入,不能运行时修改

match() 和 exec() 的关键区别:别在循环里错用 match()

match() 对带 g 标志的正则返回字符串数组(只含匹配内容),不带 g 则返回详细对象(含 indexinput);而 exec() 总是返回详细对象,且会维护 lastIndex 属性,适合手动控制匹配位置。

  • 想一次性拿到所有匹配结果 → 用 str.match(/a/g)
  • 需要每个匹配的起始位置或捕获组 → 用 reg.exec(str) 循环,注意每次调用前确认 reg.lastIndex = 0 或使用无 g 标志的正则
  • 错误写法:while ((m = /a/g.exec(str)) !== null) —— 因为 /a/g 是字面量,每次都会新建实例,lastIndex 始终为 0,变成死循环

replace() 中的 $1、$2 是什么:捕获组引用的正确姿势

replace() 的第二个参数可以是字符串或函数。字符串中 表示第一个、第二个捕获组(即括号内的子表达式)的匹配内容,$$ 表示单个 $ 字符。

立即学习“Java免费学习笔记(深入)”;

const text = "2025-12-25";
const result = text.replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1");
// → "12/25/2025"
  • 捕获组数量必须和 $1$2 等对应,否则显示为空字符串
  • 如果替换逻辑复杂(比如要转成大写、加前缀),务必改用函数: text.replace(/(\w+)/g, (match, p1) => `【${p1.toUpperCase()}】`)
  • 注意:正则中未用括号包裹的部分(如 a+b)不会产生捕获组,$1 无效

真正难的不是写出一个能跑的正则,而是预判边界情况:比如 \d+ 会把 "abc123def" 中的 123 提出来,但若文本是 "123abc456",默认贪婪匹配会让它吃掉整个 123abc456(因为 \d+ 后没跟任何限定符)。这时候得用 \d+(?=[^0-9]|$) 或非贪婪 \d+?,具体选哪个,取决于你到底想切分还是提取。

标签:# javascript  # word  # java  # js  # 正则表达式  # 工具  # 邮箱  # 区别  # 字符串数组  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!