javascript正则表达式是什么_如何用于模式匹配?

9次阅读

JavaScript 正则表达式是 RegExp 对象,非字符串技巧而是文本解析基础设施;创建方式有字面量(编译于加载时,不支持变量)和构造函数(运行时编译,需手动转义反斜杠);test()返回布尔值适合校验,exec()返回匹配详情并维护 lastIndex,match()在 g 标志下仅返回纯匹配数组;常见陷阱包括。 不匹配换行(需 s 标志)、^/$ 默认不按行匹配(需 m 标志)、Unicode 字符需 u 标志及属性类。

javascript 正则表达式是什么_如何用于模式匹配?

JavaScript 正则表达式 是内置的模式匹配引擎,本质是一个 RegExp 对象,不是字符串处理的“高级技巧”,而是底层文本解析的基础设施。

正则表达式怎么创建?字面量 vs 构造函数有啥 区别

两种方式都能创建 RegExp 实例,但行为差异直接影响动态构建和错误排查:

  • 字面量写法:/abc/gi —— 编译时机固定(脚本加载时),不能拼接变量,适合静态模式
  • 构造函数:new RegExp("a" + userInput, "g") —— 运行时编译,支持变量注入,但需手动转义反斜杠("\d" 而非 "d"
  • 错误提示不同:字面量语法错误(如 /[/)直接抛 SyntaxError;构造函数参数非法则抛 RegExpError,且只在执行时暴露(容易漏掉)

test()exec()match() 该用哪个?

选错方法会导致空数组、null 或意外全局状态,尤其涉及 g 标志时:

  • test() 最轻量,只返回 true/false,适合条件判断(如表单校验)
  • exec() 返回匹配详情(indexgroups 等),且对全局正则会维护 lastIndex,多次调用可迭代匹配 —— 但必须确保正则未被其他 代码复用,否则 lastIndex 错位
  • match() 在非全局模式下返回类似 exec() 的数组;加 g 标志后只返回纯匹配 字符串数组(丢弃索引和分组),无法获取位置信息
const re = /(d{4})-(d{2})/g; const str = "2023-01 2024-12"; console.log(re.exec(str)); // ["2023-01", "2023", "01", index: 0, ……] console.log(str.match(re)); // ["2023-01", "2024-12"] —— 没有分组和位置

常见陷阱:点号不匹配换行、^/$ 的上下文、Unicode 字符

这些不是“怪癖”,而是正则引擎默认行为与实际需求错位的典型:

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

  • . 默认不匹配 nr —— 需要 s 标志(/./s)才能启用“dotAll”模式,否则跨行文本会断裂
  • ^$ 在多行模式(m 标志)下才按行首 / 行尾匹配;无 m 时只匹配整个字符串开头 / 结尾
  • 中文、emoji 等 Unicode 字符可能被拆成多个码元(如 ?? 是两个代理对),导致 w. 匹配异常 —— 应使用 u 标志启用 Unicode 模式,并配合 p{Script=Han} 等 Unicode 属性类

真正难的不是写出一个能跑的正则,而是当它在线上突然不匹配某条日志、或在某个用户的输入里反复返回 null 时,你能否快速定位是标志位缺失、转义遗漏,还是 Unicode 边界问题。

text=ZqhQzanResources