面试中的 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
2
3
let str = "<div>hello</div>";
let greedy = str.match(/<.*>/); // "<div>hello</div>" (匹配到了最后)
let lazy = str.match(/<.*?>/); // "<div>" (遇到第一个 > 就停止)

② 括号的作用:分组与捕获

括号 () 不仅能改变优先级,还能“记住”匹配到的内容。

  • 面试题:将 2023-10-24 变成 10/24/2023
    1
    2
    let 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
2
3
4
5
function formatPrice(num) {
// 逻辑:匹配一个数字,其后面紧跟的是 3 的倍数个数字,且到末尾为止
return String(num).replace(/\d(?=(\d{3})+$)/g, "$&,");
}
console.log(formatPrice(12345678)); // "12,345,678"

注:$& 代表匹配到的那个数字本身。


快速通关清单

  1. 掌握 \d, \w, ^, $
  2. 搞清楚 test() 返回布尔值,replace() 配合 $1
  3. 知道 ? 在量词后是取消贪婪。

如果你想测试一下自己的掌握程度,要不要试着写一个验证“手机号(11位数字,1开头)”的正则?我可以帮你纠错。