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

12次阅读

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

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

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

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

text=ZqhQzanResources