讲解
正则符号密度高,盯着代码空想效率极低,趁手的工具能把调试时间压缩一个量级。在线测试器是第一选择:本站家族的正则表达式测试工具(tools.ohmygp.com 的正则工具)支持标志位切换和匹配详情高亮,地址是 https://tools.ohmygp.com/zh-cn/tools/developer/regex-tester/ ;需要更深入的分析时,regex101.com 的解释面板会把你的模式逐段翻译成自然语言,调试器还能单步观察引擎的匹配与回溯过程,学习价值极高。
工具之外,方法论更重要。第一条是「分步构建」:不要试图一口气写出完整的大正则。先把输入简化到最小样例,写出能匹配它的粗糙版本,再逐步加约束、加分支,每加一步都用样例验证。第二条是「用断言固化预期」:把「应该匹配的」和「不应该匹配的」各列几个用例,写成 console.assert(Python 里是 assert),之后每次改动模式跑一遍,立刻知道有没有改坏——本教程所有示例就是这么做的。
第三条是「读懂失败」。匹配不到时按这个顺序排查:先确认样例文本本身(有没有全角字符、隐藏空格),再把模式砍半定位出问题的段落,最后检查量词和锚点。误匹配(匹配了不该匹配的)则优先检查:有没有忘加 ^$ 锚点、点号是不是忘转义、分支有没有分组限定范围。
示例
分步构建法实战:目标是提取「姓名:张三,年龄:18」里的键值对。
// 第 1 步:最小样例 + 最粗糙的模式(注意 \w 不含汉字,键值可能是中文)
let re = /[一-龥]+:[一-龥]+/;
console.assert(re.test('姓名:张三'));
// 第 2 步:加捕获组,取出键和值
re = /([一-龥]+):([一-龥]+)/;
console.assert('姓名:张三'.match(re)[1] === '姓名');
console.assert('姓名:张三'.match(re)[2] === '张三');
// 第 3 步:值也可能是数字,支持真实输入里的多段
re = /([一-龥]+):([\w一-龥]+)/g;
const s = '姓名:张三,年龄:18';
const all = [...s.matchAll(re)];
console.assert(all.length === 2);
console.assert(all.map((m) => m[2]).join(',') === '张三,18');
把预期固化成断言,重构正则时就有安全网:
// 用例表:每个输入 + 期望结果,跑一遍就知道模式对不对
const check = (re, cases) => {
for (const [input, expected] of cases) {
const actual = re.test(input);
console.assert(actual === expected, input + ' 应为 ' + expected);
if (actual !== expected) throw new Error('用例失败: ' + input);
}
};
const mobile = /^1[3-9]\d{9}$/;
check(mobile, [
['13812345678', true], // 正例
['19912345678', true],
['23812345678', false], // 反例:第二位不在 3-9
['1381234567', false], // 反例:位数不够
['138123456789', false], // 反例:位数太多
]);
console.log('全部用例通过');
排查「看不见」的字符问题:
// 「明明一样却不匹配」多半是隐藏字符:先打印码点看看
const suspicious = '你好\u00a0世界'; // 中间是不间断空格,肉眼和普通空格一样
console.assert(/你好 世界/.test(suspicious) === false); // 普通空格匹配不上
console.assert(/你好\s世界/.test(suspicious) === true); // \s 覆盖不间断空格
console.assert(suspicious.length === 5); // 5 个码元:你好 + 空格 + 世界
常见坑
- 一口气写完整个大正则:错一处全盘皆错,还不知道错在哪。分步构建、每步验证,慢就是快。
- 只测正例不测反例:能匹配该匹配的只是及格线,反例(位数错、字符错、格式错)全被挡在门外才算完成。
- 只在一种引擎里验证:不同语言的正则方言有差异,迁移模式时在目标引擎里重新跑一遍用例表。
- 忽视样例文本本身:从网页或文档复制的文本可能含全角空格、不间断空格、零宽字符,先用码点确认文本,再怀疑正则。
小结
在线测试器(本站 tools.ohmygp.com 的正则工具、regex101)加速试验;分步构建、断言固化、反例必测是三大方法论。最后一章总结工程中的最佳实践。