学习前提
理解字符类和锚点;准备比较多个匹配结果。
本课完成后你能做什么
控制重复次数,理解贪婪与惰性匹配的选择。
先理解机制
*表示零次或更多,+表示一次或更多,?表示零或一次;{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],两者都应匹配;换行仍不允许。