面试中的 JavaScript 正则表达式(RegExp)考察通常集中在基本语法、常用方法、以及贪婪/非贪婪匹配这几个核心点。
我们直接跳过那些晦涩的专业术语,用最快的方式“通关”:
1. 核心语法:记住这几个“符号组合”
面试官最爱问:i, g, m 是什么?
修饰符:
i: 忽略大小写 (ignoreCase)。g: 全局匹配 (global),找到所有的匹配而非第一个。m: 多行匹配 (multiline)。
元字符(灵魂):
\d: 数字 (digit);\D: 非数字。\w: 字母、数字、下划线 (word);\W: 非单词字符。^: 匹配开头;$: 匹配结尾。.: 匹配除换行符外的任意单个字符。
量词:
*: 0 次或多次;+: 1 次或多次;?: 0 次或 1 次(常用于可选字符)。{n,m}: 至少 $n$ 次,最多 $m$ 次。
2. JS 中的两大类方法
这是面试中手写代码最常考的部分:
A. 正则对象的方法 (RegExp.prototype)
test(): 返回布尔值(最常用,判断是否存在)。1
/cat/i.test("climb the Cat"); // true
exec(): 返回匹配详情的数组或null。
B. 字符串的方法 (String.prototype)
match(): 找到匹配项。replace(): 替换(面试常考:结合分组$1$2进行字符串格式化)。split(): 按正则切割字符串。
3. 三个必考的高频考点
① 贪婪 vs 非贪婪 (Greedy vs Non-greedy)
正则默认是贪婪的,会尽可能多地匹配。在量词后面加 ? 变成非贪婪。
1 | let str = "<div>hello</div>"; |
② 括号的作用:分组与捕获
括号 () 不仅能改变优先级,还能“记住”匹配到的内容。
- 面试题:将
2023-10-24变成10/24/20231
2let date = "2023-10-24";
let res = date.replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1");
③ 零宽断言 (Lookahead/Lookbehind)
虽然高级,但常作为加分项。比如:匹配后面跟着“元”的数字。
\d+(?=元): 匹配“100元”中的“100”,但不包括“元”。
4. 模拟面试题:手写千分位格式化
这是各大厂最经典的正则面试题,要求把 12345678 变成 12,345,678。
1 | function formatPrice(num) { |
注:$& 代表匹配到的那个数字本身。
快速通关清单
- 掌握
\d,\w,^,$。 - 搞清楚
test()返回布尔值,replace()配合$1。 - 知道
?在量词后是取消贪婪。
如果你想测试一下自己的掌握程度,要不要试着写一个验证“手机号(11位数字,1开头)”的正则?我可以帮你纠错。