一直對(duì)正則表達(dá)式這塊比較欠缺删壮,經(jīng)常看見很多地方在用兑牡,比如匹配路由央碟,匹配電話號(hào)碼,匹配鏈接等等发绢。不是很明白其中一些符號(hào)的意思硬耍,所以看了很多的文章,最后從看的文章中摘錄一些重要的過來边酒,并做一些總結(jié)经柴。
定義
- 構(gòu)造函數(shù)
var reg = new RegExp('<%string%>', 'g');
- 字面量
var reg = /<%string%>/g
- g:global,全文搜索墩朦,默認(rèn)搜索到第一個(gè)結(jié)果就停止
- i:ignore case坯认,忽略大小寫,默認(rèn)大小寫敏感
- m: multiple lines氓涣,多行搜索(更改^和$的含義牛哺,使它們分別在任意一行對(duì)待行首和行尾匹配,而不僅僅在整個(gè)字符串的開頭和結(jié)尾匹配)
元字符
正則表達(dá)式讓人望而卻步的一個(gè)重要原因就是其轉(zhuǎn)義字符太多了劳吠,組合非常之多引润,但是正則表達(dá)式的元字符(在正則表達(dá)式中具有特殊意義的專用字符,可以用來規(guī)定其前導(dǎo)字符)并不多
元字符:([{^$|)?*+.
并不是每個(gè)元字符都有其特定意義痒玩,在不同的組合中元字符有不同的意義淳附,分類看一下
預(yù)定義特殊字符
字符 | 含義 |
---|---|
\t | 水平制表符 |
\r | 回車符 |
\n | 換行符 |
\f | 換頁符 |
\cX | 與X對(duì)應(yīng)的控制字符(Ctrl + X) |
\v | 垂直制表符 |
\0 | 空字符 |
字符類
一般情況下正則表達(dá)式一個(gè)字符(轉(zhuǎn)義字符算一個(gè))對(duì)應(yīng)字符串一個(gè)字符,比如ab\t
但是我們可以使用元字符[]來構(gòu)建一個(gè)簡(jiǎn)單的類蠢古,所謂類是指奴曙,符合某些特征的對(duì)象,是一個(gè)泛指草讶,而不是特指某個(gè)字符洽糟,我們可以使用表達(dá)式[abc]把字符a或b或c歸為一類,表達(dá)式可以匹配這類的字符
元字符[]組合可以創(chuàng)建一個(gè)類堕战,我們還可以使用元字符創(chuàng)建反向類/負(fù)向類坤溃,反向類的意思是不屬于XXX類的內(nèi)容,表達(dá)式[abc]表示不是字符a或b或c的內(nèi)容
范圍類
按照上面的說明要是我們希望匹配單個(gè)數(shù)字那么表達(dá)式是這樣的[0123456789]
如果是字母那怎么辦践啄。浇雹。。屿讽,好麻煩昭灵,正則表達(dá)式還提供了范圍類,我們可以使用x-y來連接兩個(gè)字符表示從x到y(tǒng)的任意字符伐谈,這是個(gè)閉區(qū)間烂完,也就是說包含x和y本身,這樣匹配小寫字母就很簡(jiǎn)單了[a-z]
要是想匹配所有字母呢诵棵?在[]組成的類內(nèi)部是可以連寫得抠蚣,我們還可以這樣寫[a-zA-Z]
預(yù)定義類
剛才使用正則我們創(chuàng)建了幾個(gè)類,來表示數(shù)字履澳,字母等嘶窄,但這樣寫也很麻煩怀跛,正則表達(dá)式為我們提供了幾個(gè)常用的預(yù)定義類來匹配常見的字符
字符 | 等價(jià)類 | 含義 |
---|---|---|
. | [^\n\r] | 除了回車符和換行符之外的所有字符 |
\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è)常用的邊界匹配字符
字符 | 含義 |
---|---|
^ | 以xx開頭 |
$ | 以xx結(jié)尾 |
\b | 單詞邊界漓拾,指[a-zA-Z_0-9]之外的字符 |
\B | 非單詞邊界 |
看個(gè)不負(fù)責(zé)任的郵箱正則匹配\w+@\w+\.(com)$
量詞
之前我們介紹的方法都是一一匹配的,如果我們希望匹配一個(gè)連續(xù)出現(xiàn)20次數(shù)字的字符串戒祠,難道我們需要寫成 這樣\d\d\d\d...
為此正則表達(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次 |
貪婪模式與非貪婪模式
看了上面介紹的量詞姜盈,也許愛思考的同學(xué)會(huì)想到關(guān)于匹配原則的一些問題低千,比如{3,5}這個(gè)量詞,要是在句子種出現(xiàn)了十次馏颂,那么他是每次匹配三個(gè)還是五個(gè)栋操,反正3、4饱亮、5都滿足3~5的條件矾芙,量詞在默認(rèn)下是盡可能多的匹配的,也就是大家常說的貪婪模式
`'123456789'.match(/\d{3,5}/g); //["12345", "6789"] `
既然有貪婪模式近上,那么肯定會(huì)有非貪婪模式剔宪,讓正則表達(dá)式盡可能少的匹配,也就是說一旦成功匹配不不再繼續(xù)嘗試壹无,做法很簡(jiǎn)單葱绒,在量詞后加上 ? 即可
`'123456789'.match(/\d{3,5}?/g); //["123", "456", "789"]`