最近再一次重温老姚大佬的《JavaScript 正则表达式迷你书》 , 并将核心知识点整理一遍,方便复习。
原书写得非常棒,建议看下原书啦。 地址:https://github.com/qdlaoyao/js-regex-mini-book
位置匹配,就是要匹配每个字符两边的位置。
在 ES5
中有6个位置:^
,$
,b
,B
,(?=p)
和 (?!p)
。
另外把位置理解成空字符是非常有用的:
代码语言:javascript复制/^^hello$$/.test('hello'); // true
/^^^hello$$/.test('hello'); // true
1. ^ 和 $
^
匹配开头,多行中匹配行开头。
$
匹配结尾,多行中匹配行结尾。
"hello".replace(/^|$/g, "#"); // "#hello#"
"hellonleonhaha".replace(/^|$/gm, "#");
/*
#hello#
#leo#
#haha#
*/
多行匹配模式使用 m
修饰符。
2. b
和 B
b 匹配单词边界,即 w 和 W 之间的位置,包括 w 和 ^ 之间的位置,和 w 和 之间的位置。B 和 b 相反,即非单词边界,匹配中除去 b,剩下的都是 B 的。也就是 w 与 w、 W 与 W、^ 与 W,W 与 之间的位置。。
代码语言:javascript复制"[HI] Leo_1.mp4".replace(/b/g,"#");
// "[#HI#] #Leo_1#.#mp4#"
"[HI] Leo_1.mp4".replace(/B/g,"#");
// "#[H#I]# L#e#o#_#1.m#p#4"
3. (?=p)
和 (?!p)
p
为一个子模式,即 (?=p)
匹配前面是 p
的位置,而 (?!p)
则匹配前面不是 p
的位置。
"hello".replace(/(?=l)/g, "#");
// "he#l#lo"
"hello".replace(/(?!l)/g, "#");
// "#h#ell#o#"
4. 相关案例
- 匹配数字千位分隔符
// 匹配最后一个逗号
"12345678".replace(/(?=d{3}$)/g, ","); // "12345,678"
// 匹配所有逗号
"12345678".replace(/(?=(d{3}) $)/g, ","); // "12,345,678"
// 匹配其余
"123456789".replace(/(?=(d{3}) $)/g, ","); // ",123,456,789"
// 修改
"123456789".replace(/(?!^)(?=(d{3}) $)/g, ","); // "12,345,678"
// 其他形式
"12345678 123456789".replace(/(?!b)(?=(d{3}) b)/g, ",");
// (?!b) 等于 B ,要求当前是一个位置,但不是 b 前面的位置
// "12,345,678 123,456,789"
- 数据格式化
let num = 1888;
num.toFixed(2).replace(/B(?=(d{3}) b)/g, ",").replace(/^/,"$$ ");
// "$ 1,888.00"
- 验证密码
// 密码长度 6-12 位数字或字母
let r = /^[0-9A-Za-z]{6,12}$/;
// 必须包含一个字符(数字) 密码长度 6-12 位数字或字母
let r = /(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;
// 必须包含两个个字符(数字和小写字符) 密码长度 6-12 位数字或字母
let r = /(?=.*[0-9])(?=.*[a-z])^[0-9A-Za-z]{6,12}$/;
r.test("aa1234566"); // true
r.test("1234566"); // false
// 密码长度 6-12 位数字或字母
// 即 不能全是数字 或 不能全是大写或小写字母
let r = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;