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