javascript正则表达式是什么_怎样进行模式匹配?

16次阅读

javaScript正则表达式regexp对象,创建方式有字面量(/pattern/flags)和构造函数(new RegExp(‘p’,’f’)),前者编译早、性能好,后者支持动态生成;常用方法包括match、test、replace、split;exec()因lastIndex状态易出错,需谨慎重置或改用match;注意u标志处理Unicode、s标志使.匹配换行符、m标志改变^$含义,避免贪婪量词引发回溯爆炸。

javascript正则表达式是什么_怎样进行模式匹配?

javascript 正则表达式是内置的模式匹配工具,本质是一个 RegExp 对象,用来描述、查找、替换符合特定规则的字符串

怎样创建正则表达式?

两种方式:字面量语法和构造函数。区别在于编译时机和动态性。

  • 字面量写法:/pattern/flags,如 /abc/g,在代码解析时就编译,性能好,但无法拼接变量
  • 构造函数写法:new RegExp('pattern', 'flags'),运行时编译,支持动态生成,但注意反斜杠要双写(如匹配 d 得写成 '\d'
  • 常见 flags:g(全局)、i(忽略大小写)、m(多行模式)、u(Unicode 模式,处理 emoji 或中文更可靠)

常用匹配方法有哪些?

String.prototype 提供了多个直接操作正则的方法,比手动调用 RegExp.prototype.exec() 更常用。

  • str.match(/pattern/g):返回匹配数组,无匹配时返回 NULL;加 g 返回所有结果,不加只返回第一个及捕获组信息
  • str.test(/pattern/):返回布尔值,适合条件判断,比如表单校验
  • str.replace(/pattern/, 'newStr'):支持字符串或函数作为替换值;若 pattern 无 g,只替换第一个
  • str.split(/pattern/):按正则切分字符串,比如用 /\s+/ 拆分连续空白

为什么 exec() 会重复返回同一结果?

因为 exec() 是有状态的——它会修改正则实例的 lastIndex 属性,用于后续调用继续查找。这在全局模式下尤其容易出错。

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

  • 如果正则带 g 标志且被多次调用,必须确保每次调用前 lastIndex === 0,否则可能漏匹配或死循环
  • 避免复用同一个正则实例做多次 exec(),除非你明确控制 lastIndex
  • 更安全的做法是改用 match() 或重置:
    const re = /a/g;
    re.lastIndex = 0; // 手动重置
    re.exec('abac');

容易忽略的细节

正则不是“越复杂越强”,很多问题其实靠简单模式+逻辑组合更稳。

  • . 默认不匹配换行符,需要 /s flag(ES2018+)才能让 . 匹配包括 n 在内的所有字符
  • 中文、emoji 等 Unicode 字符,在未启用 u 标志时可能被拆成两个码元,导致 wb 失效
  • 正则中的 ^$m 模式下才匹配每行开头/结尾,否则只匹配整个字符串首尾
  • 过度使用贪婪量词(如 .*)可能导致回溯爆炸,长文本下卡顿甚至溢出

text=ZqhQzanResources