学习前提
理解正则字面量、test及完整输入校验;了解JavaScript字符串转义。
本课完成后你能做什么
理解方括号的单字符含义,精确表达允许字符。
先理解机制
方括号表示从集合中取一个字符,[abc]不是匹配整个abc。范围[a-z]只涵盖ASCII小写字母;[^0-9]表示一个非ASCII数字字符。连字符写在类的末尾可以避免被误读为范围。
JavaScript的\d匹配0到9,\w主要面向ASCII字母、数字和下划线,不能用来概括中文等所有文字。\s包含换行等空白;若只允许空格与制表符,可明确使用[ \t]。
本例用户名第一位必须是小写字母,后续允许小写字母、数字、下划线或连字符,总长3到12。\b是单词字符与非单词字符间的边界,并不是通用的自然语言分词器。
可运行示例
const username = /^[a-z][a-z0-9_-]{2,11}$/;
console.log(JSON.stringify(["ada_7", "7ada", "ab", "a-b", "学习者"].map(s => username.test(s))));
console.log(JSON.stringify("one\t two\nthree".split(/[ \t]+/)));
console.log(JSON.stringify("cat scatter cat_2 cat!".match(/\bcat\b/g)));
推演与验证
用户名结果为true、false、false、true、false。split只拆空格和制表符,换行留在最后一个片段内;单词匹配仅得到首尾两个cat。
常见错误与边界
不要使用[A-z]代替[A-Za-z],因为字符编码中间还包含标点。字符白名单是明确业务选择,不代表其他姓名或文字不合法。
动手练习
允许首字母大写,但保持后续字符规则不变。
参考解法与理由
仅把首位改成[A-Za-z],不要给整个表达式加i。新规则允许Ada但不允许aDa,因为需求只放宽第一位。