正則這玩意兒,在我剛入行的時候,簡直就是我的噩夢。網上搜來的代碼,只要帶RegExp
,我基本就是復制粘貼,然后默默祈禱它能跑。那串鬼畫符到底啥意思?我不敢問,也不想懂。
但后來,你總會遇到一些繞不開的場景,比如校驗用戶輸入的表單。總復制粘貼也不是個事兒,萬一產品經理說規則要改一下呢?你總不能再去網上搜一圈吧。
沒辦法,硬著頭皮學了一下。后來發現,其實我們日常開發,尤其是前端,真正用得上的,來來回回就那么幾個。你只要把這幾個“套路”搞明白了,就能解決80%的問題。
今天,就把我總結的這10個“套路”分享給你。我不講復雜的原理,咱就用“人話”講明白。
1. 校驗手機號碼
驗證用戶輸入的是不是一個“1”開頭、第二位是3~9之間的任意數字,后面再跟9個數字,總共11位的中國大陸手機號。
const regex = /^1[3-9]\d{9}$/;
拆解講解一下:
^
:這個東西叫“行首定位符”,你可以理解為“從頭開始檢查”。1
:手機號第一個數字必須是1。這是鐵律,國家規定的。[3-9]
:第二位必須是3~9之間的一個數字,常見的號段(像138、147、166、199等)都在這兒。\d{9}
:后面跟著9個數字,這沒啥好說的。$
:這是“行尾定位符”,意思是檢查到這就結束了,后面不能有其他字符。
連接起來就是:從頭開始,必須以1開頭,第二位是3~9,然后再跟9個數字,一共11位,干凈整齊,不能有符號、空格、括號啥的。
2. 校驗電子郵件 (Email)
檢查用戶輸入的是不是一個像xxx@yyy.zzz格式的郵箱。
const regex = /^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$/;
(我知道這個看起來嚇人,別怕,我們慢慢拆)
^
和 $
:老朋友了,從頭到尾。\w
:意思是“任意一個字母、數字或下劃線”。。+
:意思是“前面的那個東西,至少要出現1次,多幾次也行”。所以 \w+
就是“一串字母數字下劃線”。[...]
:中括號,意思是“里面的字符,隨便選一個就行”。比如 [-+.]
就是說“可以是橫杠,可以是加號,也可以是點”。*
:意思是“前面的那個東西,可以不出現(0次),也可以出現好多次”。()
:括號是“分組”,就是把一堆東西包起來當成一個整體。
現在我們把上面那坨再走一遍:
^\w+
:以一串字母/數字/下劃線開頭。
([-+.]\w+)*
:后面可以跟好幾個“特殊符號(點/加號/橫杠) + 一串字母數字”的組合 (比如 -smith
或者 .123
)。
@
:然后必須有個@符號。
后面的 \w+([-.]\w+)*
:跟前面一樣,是域名部分 (比如 gmail
或者 company-inc
)。
.
:這個 `` 是“轉義符”,因為 .
在正則里有特殊含義(代表任意字符),所以要用 .
來告訴它,我這里就是要一個普普通通的“點”。
最后一部分跟域名一樣,就是頂級域名部分 (比如 com
)。
regex.test('test.user-1@gmail.com');
regex.test('test@gmail');
3. 校驗密碼強度
檢查密碼是不是至少8個字符,并且同時包含字母和數字。
const regex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/;
- 這個新的東西叫
(?=...)
,它叫 “正向先行斷言”,聽著嚇人,其實意思很簡單,就是 “往后看,看看是不是滿足某個條件,但看完不消耗字符,只是檢查一下而已”。 (?=.*[A-Za-z])
:往后瞅瞅,有沒有字母?(.*
意思是任意字符出現任意次數)(?=.*\d)
:再往后瞅瞅,有沒有數字?[A-Za-z\d]{8,}
:好了,不瞅了,正式開始匹配。這里必須是字母或數字,并且 {8,}
意思是“至少出現8次”。
連起來就是:從頭到尾,必須滿足“含有字母”和“含有數字”這兩個條件,并且整個字符串是由至少8個字母或數字組成的。
4. 只允許輸入中文
檢查字符串是不是全都是中文字。
const regex = /^[\u4e00-\u9fa5]+$/;
5. 提取URL中的域名
從一個網址里,把域名給摳出來。
const regex = /^(?:https?://)?(?:[^/]+)/i;
(?:...)
:這個叫“非捕獲組”,跟()
差不多,也是打包,但它只匹配,不“抓”下來存著,效率高點。
https?
:s
后面的?
意思是“s這個字母,可以有,也可以沒有”。所以就能匹配http
和https
。
://
:就是普通的://
。
[^/]+
:這里的 ^
是在中括號[]
里面,意思反了,是“不要匹配斜杠/
”。所以 [^/]+
就是“一串不包含斜杠的字符”。
/i
:最后的i
是個修飾符,意思是“忽略大小寫”(ignore case)。
測試一下:
'https://juejin.cn/user/123'.match(regex)[0];
'www.google.com/search'.match(regex)[0];
(為保持簡潔,下面5個只列出核心,大家可以舉一反三)
6. 校驗身份證號碼
- 正則:
/^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/
- 解釋:
7. 匹配HTML標簽
- 正則:
/<(.*?)>/
- 解釋: 抓取尖括號
<
和>
之間的所有東西。.*?
叫“非貪婪匹配”,意思是抓到第一個>
就收手,免得把整行HTML都抓進來了。
8. 檢查文件是否為圖片
- 正則:
/.(jpg|jpeg|png|gif|bmp)$/i
- 解釋: 以“.”開頭,后面跟著jpg或jpeg或png...這些東西,并且忽略大小寫。
|
就是“或者”的意思。
9. 獲取字符串中的所有數字
- 正則:
/\d+/g
- 解釋: 匹配所有“一串或多串數字”。最后的
g
是“全局匹配”(global),不然只找到第一個就停了。
10. 去除字符串首尾的空白
- 正則:
/^\s*|\s*$/g
- 解釋: 匹配開頭(
^
)的零個或多個空白(\s*
),或者(|
)匹配結尾($
)的零個或多個空白。全局替換成空字符串就行了。(當然,現在我們都用.trim()
方法了,這個主要是用來理解正則)。
好了,10個最常用的“套路”講完了。
正則這東西, 我的建議是,在一些在線的正則測試網站(比如 regex101.com?),把你的字符串和表達式貼上去,它會一步步給你解釋,特別直觀。
反正我現在看到正則,心里不那么慌了。希望你也是,謝謝大家??。
該文章在 2025/7/7 11:20:42 編輯過