📖 正则表达式学习指南
原文引荐:JS正则表达式迷你书
🎨 第一章:正则表达式字符匹配攻略
1. 两种模糊匹配方式
1.1 横向模糊匹配 ↔️
横向模糊指的是,一个正则可匹配的字符串长度不是固定的,可以是多种情况。
js
// 示例:匹配连续出现2-5次的字母b
const regex = /ab{2,5}c/g;
const string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(string.match(regex));
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]1.2 纵向模糊匹配 ↕️
纵向模糊指的是,匹配的字符串中具体某个字符可以有多种可能。
js
// 示例:匹配a后面是1或2或3,然后是b的字符串
const regex = /a[123]b/g;
const string = "a0b a1b a2b a3b a4b";
console.log(string.match(regex));
// => ["a1b", "a2b", "a3b"]2. 字符组 🎭
2.1 基本概念
虽然叫字符组(字符类),但实际上只匹配其中一个字符。 例如 [abc],表示匹配一个字符,它可以是 "a"、"b"、"c" 之一。
2.2 范围表示法 📏
js
// 使用连字符-来表示范围
[123456abcdefGHIJKLM] 可以写成 [1-6a-fG-M]
// 匹配 "-" 字符的方法:
[-az] 或 [az-] 或 [a\-z] // 将-放在开头或结尾,或转义2.3 排除字符组 ❌
js
// 使用^表示取反
[^abc] // 表示除了abc之外的任意字符2.4 常见简写形式 📝
js
\d [0-9] 一位数字
\D [^0-9] 除数字外的任意字符
\w [0-9a-zA-Z_] 数字、字母、下划线
\W [^0-9a-zA-Z_] 非单词字符
\s [ \t\v\n\r\f] 空白符
\S [^ \t\v\n\r\f] 非空白符
. [^\n\r\u2028\u2029] 通配符3. 量词 🔢
3.1 基本量词
js
{m,} 至少出现m次
{m} 等价于{m,m},出现m次
? 等价于{0,1},出现或不出现
+ 等价于{1,},至少出现一次
* 等价于{0,},出现任意次3.2 贪婪与惰性匹配 🐯
js
// 贪婪匹配(默认)
const regex = /\d{2,5}/g;
const string = "123 1234 12345 123456";
console.log(string.match(regex));
// => ["123", "1234", "12345", "12345"]
// 惰性匹配(在量词后加?)
const regex = /\d{2,5}?/g;
console.log(string.match(regex));
// => ["12", "12", "34", "12", "34", "12", "34", "56"]4. 多选分支 🔀
使用 | 实现"或"的效果:
js
const regex = /good|nice/; // 匹配"good"或"nice"5. 实战案例 💡
5.1 匹配16进制颜色值
js
const regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;
const string = "#ffbbad #Fc01DF #FFF #ffE";
console.log(string.match(regex));
// => ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]5.2 匹配时间
js
// 24小时制时间(精确)
const regex = /^([01][0-9]|[2][0-3]):[0-5][0-9]$/;
console.log(regex.test("23:59")); // => true
console.log(regex.test("02:07")); // => true
// 24小时制时间(宽松)
const regex = /^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/;
console.log(regex.test("7:9")); // => true5.3 匹配日期
js
const regex = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;
console.log(regex.test("2017-06-10")); // => true💡 最佳实践
- 使用正则测试网站验证表达式
- 复杂正则要写注释说明
- 考虑使用命名捕获组提高可读性
- 注意性能,避免回溯陷阱