正則表達(dá)式(Regular Expression)是計(jì)算機(jī)科學(xué)的一個(gè)概念比被。正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。在很多文本編輯器里叫编,正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)模式的文本霹抛。
JavaScript通過內(nèi)置對象RegExp
支持正則表達(dá)式搓逾,有兩種方式創(chuàng)建正則表達(dá)式對象
- 使用字面量,以斜杠表示開始和結(jié)束杯拐。
var regex = /xyz/;
- 使用RegExp構(gòu)造函數(shù)
var regex = new RegExp('xyz');
以上兩種寫法是等價(jià)的霞篡,都新建了一個(gè)內(nèi)容為xyz的正則表達(dá)式對象。它們的主要區(qū)別是藕施,第一種方法在編譯時(shí)新建正則表達(dá)式寇损,第二種方法在運(yùn)行時(shí)新建正則表達(dá)式。
RegExp 構(gòu)造函數(shù)還可以接受第二個(gè)參數(shù)裳食,表示修飾符:
var regex = new RegExp('xyz', 'i');
var regex = /xyz/i;
//上面代碼中矛市,正則表達(dá)式`/xyz/`有一個(gè)修飾符`i`
常用修飾符:
- g: global,全文搜索诲祸,不添加的話搜索到第一個(gè)結(jié)果停止搜索
- i: ingore case浊吏,忽略大小寫,默認(rèn)大小寫敏感
- m: multiple lines救氯,多行搜索
元字符
在正則表達(dá)式中具有特殊意義的專用字符找田,可以用來規(guī)定其前導(dǎo)字符
字符 | 含義 |
---|---|
\t | 水平制表符 |
\r | 回車符 |
\n | 換行符 |
\f | 換頁符 |
\v | 垂直制表符 |
\0 | 空字符 |
字符類
一般情況下正則表達(dá)式一個(gè)字符(轉(zhuǎn)義字符算一個(gè))對應(yīng)字符串一個(gè)字符,但是我們可以使用元字符[]
來構(gòu)建一個(gè)簡單的類着憨,比如[abcd]
代表一個(gè)字符墩衙,這個(gè)字符可以是abcd
四個(gè)字符中的任意一個(gè).
取反
元字符[]
組合可以創(chuàng)建一個(gè)類,我們還可以使用元字符^
創(chuàng)建反向類/負(fù)向類,意思是不屬于這個(gè)類的內(nèi)容漆改,表達(dá)式[^abc]
表示一個(gè)不是字符a或b或c的字符心铃。
范圍類
如何匹配單個(gè)字符
//匹配一個(gè)字符,這個(gè)字符可以是0-9中的任意一個(gè)
var reg1 = /0123456789/;
//匹配一個(gè)字符挫剑,這個(gè)字符可以是0-9中的任意一個(gè)
var reg2 = /[0-9]/;
//匹配一個(gè)字符去扣,這個(gè)字符可以是a-z中的任意一個(gè)
var reg3 = /[a-z]/;
//匹配一個(gè)字符,這個(gè)字符可以是大寫字幕樊破、小寫字母愉棱、數(shù)字中的任意一個(gè)
var reg4 = /[a-zA-Z0-9]/;
預(yù)定義類
字符 | 等價(jià) | 類含義 |
---|---|---|
. | [^\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ù)定義類奔滑,寫一些正則就很方便了,例如希望匹配一個(gè)可以是ab+數(shù)字+任意字符
的字符串惫恼,就可以這樣寫\ab\d.
邊界
正則表達(dá)式還提供了幾個(gè)常用的邊界匹配字符
字符 | 含義 |
---|---|
^ | 以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ū)分單詞邊界
量詞
如果我們希望匹配一個(gè)連續(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]
*
:表示匹配一個(gè)連續(xù)出現(xiàn)多次的字符串的次數(shù)粒没,出現(xiàn)次數(shù)為任意次
+
:表示匹配一個(gè)連續(xù)出現(xiàn)多次的字符串的次數(shù),出現(xiàn)次數(shù)為至少出現(xiàn)一次
?
:表示匹配一個(gè)字符串簇爆,出現(xiàn)次數(shù)為最多一次
x{3}
:匹配x字符癞松,出現(xiàn)次數(shù)為3次
^
:邊界匹配字符,以xxx開頭入蛆。在[]
中使用表示取反
$
:邊界匹配字符
寫一個(gè)函數(shù)trim(str)响蓉,去除字符串兩邊的空白字符
注:匹配所有空白符并將其替換成空字符
寫一個(gè)函數(shù)isEmail(str),判斷用戶輸入的是不是郵箱
注:匹配以數(shù)字字母下劃線開頭多次加 @ 后接數(shù)字字母下劃線多次哨毁,以.com結(jié)尾
寫一個(gè)函數(shù)isPhoneNum(str)枫甲,判斷用戶輸入的是不是手機(jī)號
注:匹配以13、15扼褪、17想幻、18開頭后接9個(gè)數(shù)字的字符串
寫一個(gè)函數(shù)isValidUsername(str),判斷用戶輸入的是不是合法的用戶名(長度6-20個(gè)字符话浇,只能包括字母脏毯、數(shù)字、下劃線)
注:匹配有字母數(shù)字下劃線幔崖,長度為6-20的字符串