【正則】956- 正則表達式有幾種位置匹配模式?

最近再一次重溫老姚大佬的《JavaScript 正則表達式迷你書》 , 并將核心知識點整理一遍,方便復習。
原書寫得非常棒,建議看下原書啦。 地址:https://github.com/qdlaoyao/js-regex-mini-book
位置匹配,就是要匹配每個字符兩邊的位置。
在 ES5 中有6個位置:^,$,\b,\B,(?=p) 和 (?!p)。
另外把位置理解成空字符是非常有用的:
/^^hello$$/.test('hello'); // true
/^^^hello$$/.test('hello'); // true
1. ^ 和 $
^ 匹配開頭,多行中匹配行開頭。$ 匹配結尾,多行中匹配行結尾。
"hello".replace(/^|$/g, "#"); // "#hello#"
"hello\nleo\nhaha".replace(/^|$/gm, "#");
/*
#hello#
#leo#
#haha#
*/
多行匹配模式使用 m 修飾符。
2. \b 和 \B
\b 匹配單詞邊界,即 \w 和 \W 之間的位置,包括 \w 和 ^ 之間的位置,和 \w 和 $ 之間的位置。\B 和 \b 相反,即非單詞邊界,匹配中除去 \b,剩下的都是 \B 的。也就是 \w 與 \w、 \W 與 \W、^ 與 \W,\W 與 $ 之間的位置。。
"[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. 相關案例
匹配數(shù)字千位分隔符
// 匹配最后一個逗號
"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"
數(shù)據(jù)格式化
let num = 1888;
num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/,"$$ ");
// "$ 1,888.00"
驗證密碼
// 密碼長度 6-12 位數(shù)字或字母
let r = /^[0-9A-Za-z]{6,12}$/;
// 必須包含一個字符(數(shù)字) + 密碼長度 6-12 位數(shù)字或字母
let r = /(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;
// 必須包含兩個個字符(數(shù)字和小寫字符) + 密碼長度 6-12 位數(shù)字或字母
let r = /(?=.*[0-9])(?=.*[a-z])^[0-9A-Za-z]{6,12}$/;
r.test("aa1234566"); // true
r.test("1234566"); // false
// 密碼長度 6-12 位數(shù)字或字母
// 即 不能全是數(shù)字 或 不能全是大寫或小寫字母
let r = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;

回復“加群”與大佬們一起交流學習~
點擊“閱讀原文”查看 120+ 篇原創(chuàng)文章
評論
圖片
表情
