学习前提

理解字符类和锚点;准备比较多个匹配结果。

本课完成后你能做什么

控制重复次数,理解贪婪与惰性匹配的选择。

先理解机制

*表示零次或更多,+表示一次或更多,?表示零或一次;{m,n}限制次数。量词作用于紧邻的字符或分组,不会自动作用于整个表达式。

贪婪量词先尝试更多字符,惰性量词在量词后加?,先尝试更少字符;两者都会受后续模式约束。惰性不等于绝不回溯,也不自动更高效。

若分隔内容明确不能包含右方括号,用[^\]]+表达边界比任意字符.*更直接。下面只是平面标签练习,不处理嵌套括号,也不尝试解析HTML。

可运行示例

const text = "[one] [two]";
console.log(JSON.stringify(text.match(/\[.*\]/g)));
console.log(JSON.stringify(text.match(/\[.*?\]/g)));
console.log(JSON.stringify(text.match(/\[[^\]\r\n]+\]/g)));
console.log(JSON.stringify(["", "a", "aaaa"].map(s => /^a{1,3}$/.test(s))));

推演与验证

贪婪版本从第一个左括号一直取到最后一个右括号;另两个版本得到独立的one和two标签。次数范围1到3拒绝空串和四个a。

常见错误与边界

.*?仍可能匹配空内容;是否允许[]应单独决定。使用排除类时也要明确换行是否允许。

动手练习

修改第三个模式,让[]也成为合法标签。

参考解法与理由

把排除类后的+改为*,其他部分不变。新增测试[]和[one],两者都应匹配;换行仍不允许。

进一步阅读