前言
一直髮現我是個野路子,在學完 TS 和 Express 後,纔回過頭來想鞏固一下 正則 的知識,不過話說回來,有了 TS 一些可選參數,以及 後端框架的路由匹配機制後,其實對於正則的理解是有一定作用的。類比這些概念時,發現有太多太多的相似之處,下面將會例舉。
所以說,貼近標準,跟隨標準(世界大廠)是最最最重要的,像小程序這樣反 URL 透明可見的精神的產物,站在非商業的角度來看,確實沒有任何價值。扯遠了。。。
下面開始用自己的話來進行盤點:
量詞
我們在匹配字符串中某個 子段 時,需要有足夠的數量去進行限制,這樣才能保證匹配到的結果足夠準確。
常見的量詞有:
- ? => 意思爲:可選 0 或者 1 ,跟 ts 函數的可選參數一樣
- + => 意思爲: 1個或者多個
- * => 意思爲:通配符,0個或者任意個
Range 區間
例如,我想匹配 1~5 個 ‘a’ , 用 【量詞】中的哪個都不合適,這時候就應該有一個區間的概念來進行約束:
const reg = /^a{1,5}/i;
'a'.match(reg); // 匹配 1 個 a , ["a", index: 0, input: "a", groups: undefined]
...
reg.test('aaaaa'); // 匹配 5 個 ,["aaaaa", index: 0, input: "aaaaa", groups: undefined]
reg.test('aaaaaa'); // 只能匹配到 5 個 ["aaaaa", index: 0, input: "aaaaaaaaa", groups: undefined]
可見,{ } 中的邊界,是數學定義上的 左右閉合區間。
另外,還有一種區間,先看下實例:
[a-z] 代表匹配 a-z 的小寫字母,[A-Z] 匹配 A 的大寫字母。這些用 “-” 來表示的字符集,都是通過 ASCII 碼 來進行排序的。
舉個 🌰:
const reg = /([a-z][A-Z]){1,2}/;
reg.test('aZ'); // true
reg.test('aBcccadsadsad') // true 匹配到了一個
內置特殊匹配器
爲了不讓廣大開發者寫出太過於雷人的代碼,也是內置了許多匹配器:
- \b 匹配單詞邊界 \B 匹配非單詞邊界
- \w 匹配字母 \W 匹配非字母
- \d 匹配數字 \D 匹配非數字
- 其他製表符和換行符等
待續。。。