正則表達(dá)式(Regular Expression)是計算機(jī)科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些符合某個模式的文本。
JavaScript通過內(nèi)置對象RegExp支持正則表達(dá)式,有兩種方式創(chuàng)建正則表達(dá)式對象
- 使用字面量,以斜杠表示開始和結(jié)束。
var regex = /xyz/; - 使用RegExp構(gòu)造函數(shù)
var regex = new RegExp('xyz');
以上兩種寫法是等價的,都新建了一個內(nèi)容為xyz的正則表達(dá)式對象。它們的主要區(qū)別是,第一種方法在編譯時新建正則表達(dá)式,第二種方法在運(yùn)行時新建正則表達(dá)式。
RegExp 構(gòu)造函數(shù)還可以接受第二個參數(shù),表示修飾符:
var regex = new RegExp('xyz', 'i');
var regex = /xyz/i;
//上面代碼中,正則表達(dá)式`/xyz/`有一個修飾符`i`
常用修飾符:
- g: global,全文搜索,不添加的話搜索到第一個結(jié)果停止搜索
- i: ingore case,忽略大小寫,默認(rèn)大小寫敏感
- m: multiple lines,多行搜索
元字符
在正則表達(dá)式中具有特殊意義的專用字符,可以用來規(guī)定其前導(dǎo)字符
| 字符 | 含義 |
|---|---|
| \t | 水平制表符 |
| \r | 回車符 |
| \n | 換行符 |
| \f | 換頁符 |
| \v | 垂直制表符 |
| \0 | 空字符 |
字符類
一般情況下正則表達(dá)式一個字符(轉(zhuǎn)義字符算一個)對應(yīng)字符串一個字符,但是我們可以使用元字符[]來構(gòu)建一個簡單的類,比如[abcd]代表一個字符,這個字符可以是abcd四個字符中的任意一個.
取反
元字符[]組合可以創(chuàng)建一個類,我們還可以使用元字符^創(chuàng)建反向類/負(fù)向類,意思是不屬于這個類的內(nèi)容,表達(dá)式[^abc]表示一個不是字符a或b或c的字符。

范圍類
如何匹配單個字符
//匹配一個字符,這個字符可以是0-9中的任意一個
var reg1 = /0123456789/;
//匹配一個字符,這個字符可以是0-9中的任意一個
var reg2 = /[0-9]/;
//匹配一個字符,這個字符可以是a-z中的任意一個
var reg3 = /[a-z]/;
//匹配一個字符,這個字符可以是大寫字幕、小寫字母、數(shù)字中的任意一個
var reg4 = /[a-zA-Z0-9]/;
預(yù)定義類
| 字符 | 等價 | 類含義 |
|---|---|---|
| . | [^\r\n] | 除了回車符和換行符之外的所有字符 |
| \d | [0-9] | 數(shù)字字符 |
| \D | [^0-9] | 非數(shù)字字符 |
| \s | [\t\n\x0B\f\r] | 空白符 |
| \S | [^\t\n\x0B\f\r] | 非空白符 |
| \w | [a-zA-Z_0-9] | 單詞字符,字母、數(shù)字下劃線 |
| \W | [^a-zA-Z_0-9] | 非單詞字符 |
有了這些預(yù)定義類,寫一些正則就很方便了,例如希望匹配一個可以是ab+數(shù)字+任意字符的字符串,就可以這樣寫\ab\d.
邊界
正則表達(dá)式還提供了幾個常用的邊界匹配字符
| 字符 | 含義 |
|---|---|
| ^ | 以xxx開頭 |
| $ | 以xxx結(jié)尾 |
| \b | 單詞邊界 |
| \B | 非單詞邊界 |
var str = 'hello1 world hello2 123456 \t \r zuo \n dong hello3'
str.match(/hello\d/g) // ["hello1", "hello2", "hello3"]
str.match(/^hello\d/g) // ["hello1"]
str.match(/hello\d$/g) // ["hello3"]
var str2 = 'hello1 whello9orld hello2 12-hello8-3456 \t \r zuo \n dong hello3'
str2.match(/\bhello\d\b/g) //["hello1", "hello2", "hello8", "hello3"]
//注意-也用于區(qū)分單詞邊界
量詞
如果我們希望匹配一個連續(xù)出現(xiàn)多次的字符串該怎么做呢,正則表達(dá)式引入了一些量詞
| 字符 | 含義 |
|---|---|
| ? | 出現(xiàn)零次或一次(最多出現(xiàn)一次) |
| + | 出現(xiàn)一次或多次(至少出現(xiàn)一次) |
| * | 出現(xiàn)零次或多次(任意次) |
| {n} | 出現(xiàn)n次 |
| {n,m} | 出現(xiàn)n到m次 |
| {n,} | 至少出現(xiàn)n次 |
var str1 = 'http://zuodong.com'
str1.match(/https?:\/\/.+/) //匹配
str1.match(/https+:\/\/.+/) //不匹配
str1.match(/https*:\/\/.+/) //匹配
var str2 = 'https://zuodong.com'
str2.match(/https?:\/\/.+/) //匹配
str2.match(/https+:\/\/.+/g) //匹配
str2.match(/https*:\/\/.+/g) //匹配
var str3 = 'httpssssss://zuodong.com'
str3.match(/https?:\/\/.+/g) //不匹配
str3.match(/https+:\/\/.+/g) //匹配
str3.match(/https*:\/\/.+/g) //匹配
實(shí)例演練
\d,\w, \s, [a-zA-Z0-9], \b, ., *, +, ?, x{3}, ^, $分別是什么?
\d:匹配數(shù)字字符[0-9]
\w:匹配單詞字符、字母、數(shù)字下劃線[a-zA-Z_0-9]
\s:匹配空白符[\t\n\x0B\f\r]
[a-zA-Z0-9]:匹配大小寫單詞字符、字母、數(shù)字
\b:單詞邊界
.:除了回車符和換行符之外的所有字符[^\r\n]
*:表示匹配一個連續(xù)出現(xiàn)多次的字符串的次數(shù),出現(xiàn)次數(shù)為任意次
+:表示匹配一個連續(xù)出現(xiàn)多次的字符串的次數(shù),出現(xiàn)次數(shù)為至少出現(xiàn)一次
?:表示匹配一個字符串,出現(xiàn)次數(shù)為最多一次
x{3}:匹配x字符,出現(xiàn)次數(shù)為3次
^:邊界匹配字符,以xxx開頭。在[]中使用表示取反
$:邊界匹配字符
寫一個函數(shù)trim(str),去除字符串兩邊的空白字符

注:匹配所有空白符并將其替換成空字符
寫一個函數(shù)isEmail(str),判斷用戶輸入的是不是郵箱

注:匹配以數(shù)字字母下劃線開頭多次加 @ 后接數(shù)字字母下劃線多次,以.com結(jié)尾
寫一個函數(shù)isPhoneNum(str),判斷用戶輸入的是不是手機(jī)號

注:匹配以13、15、17、18開頭后接9個數(shù)字的字符串
寫一個函數(shù)isValidUsername(str),判斷用戶輸入的是不是合法的用戶名(長度6-20個字符,只能包括字母、數(shù)字、下劃線)

注:匹配有字母數(shù)字下劃線,長度為6-20的字符串