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

JavaScript 正则表达式是内置的模式匹配引擎,本质是一个 RegExp 对象,不是字符串处理的“高级技巧”,而是底层文本解析的基础设施。
正则表达式怎么创建?字面量 vs 构造函数有啥区别?
两种方式都能创建 RegExp 实例,但行为差异直接影响动态构建和错误排查:
- 字面量写法:
/abc/gi—— 编译时机固定(脚本加载时),不能拼接变量,适合静态模式 - 构造函数:
new RegExp("a" + userInput, "g")—— 运行时编译,支持变量注入,但需手动转义反斜杠("\\d"而非"\d") - 错误提示不同:字面量语法错误(如
/[/)直接抛SyntaxError;构造函数参数非法则抛RegExpError,且只在执行时暴露(容易漏掉)
test()、exec()、match() 该用哪个?
选错方法会导致空数组、null 或意外全局状态,尤其涉及 g 标志时:
-
test()最轻量,只返回true/false,适合条件判断(如表单校验) -
exec()返回匹配详情(index、groups等),且对全局正则会维护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 字符
这些不是“怪癖”,而是正则引擎默认行为与实际需求错位的典型:
Unix in a Nutshell同时涵盖了许多重要的、业界标准的开放源码工具 本书还完整地讨论了常用的shell(bash、ksh及tcsh)和重要元素如正则表达式,乃至旧式工具如sed、awk与vi。 Unix不是一个庞大的物体:它是一个综合体,而《Unix技术手册》则是将这一切合并在一起的一本书。 到底unix是什么?原始的unix源码是由sco拥有,unix注册商标是由open group拥有,而领先的仿unix系统则是gnu/linux、mac os x及solaris。这些版本所附的命令与选
立即学习“Java免费学习笔记(深入)”;
-
.默认不匹配\n、\r—— 需要s标志(/./s)才能启用“dotAll”模式,否则跨行文本会断裂 -
^和$在多行模式(m标志)下才按行首/行尾匹配;无m时只匹配整个字符串开头/结尾 - 中文、emoji 等 Unicode 字符可能被拆成多个码元(如 ?? 是两个代理对),导致
\w或.匹配异常 —— 应使用u标志启用 Unicode 模式,并配合\p{Script=Han}等 Unicode 属性类
真正难的不是写出一个能跑的正则,而是当它在线上突然不匹配某条日志、或在某个用户的输入里反复返回 null 时,你能否快速定位是标志位缺失、转义遗漏,还是 Unicode 边界问题。










