今天簡單來講一講正則,尤其是一些我們在前端開發(fā)中可能會(huì)使用到的一些內(nèi)容。
匹配字符串
兩種模糊匹配的方式
1.1 橫向模糊匹配
橫向模糊是指匹配字符串的長度是可變的。
橫向匹配采用量詞的方式來實(shí)現(xiàn),譬如如下一個(gè)正則表達(dá)式:
/ab{1,2}c/表示的是:第一個(gè)字符是'a',然后是1個(gè)或者兩個(gè)'b',最后是'c',在這個(gè)例子中,我們并不能確定他最終能匹配到的字符串的長度,可能是3個(gè),也可能是4個(gè),這種情況我們就稱之為是橫向模糊匹配。
量詞的用法:
| 寫法 | 含義 |
|---|---|
| {m,n} | 表示最少出現(xiàn)m次,最多出現(xiàn)n次。 |
| {m,} | 表示最少出現(xiàn)m次。 |
| {m} | 等價(jià)于{m,m},表示最少出現(xiàn)m次,最多出現(xiàn)m次,即出現(xiàn)m次。 |
| ? | 等價(jià)于{0,1},表示出現(xiàn)一次或者不出現(xiàn)。 |
| + | 等價(jià)于{1,},表示最少出現(xiàn)一次。 |
| * | 等價(jià)于{0,},表示可以出現(xiàn)任意次,也可以不出現(xiàn)。 |
貪婪匹配和惰性匹配
這是字符匹配的兩大特性,在我們剛才那個(gè)例子中,譬如我么可以看下面這個(gè)例子,/\d{1,3}/,這里我們用到了\d代表匹配數(shù)字,這個(gè)在下文中會(huì)有提到。
現(xiàn)在我們?nèi)テヅ?code>123456這個(gè)字符串,得到的結(jié)果為123,因?yàn)樗澙返奶匦?,他?huì)盡可能的匹配更多的字符。
而惰性匹配則與他正好相反,盡可能少的匹配結(jié)果,我們可以通過加一個(gè)問號來實(shí)現(xiàn)惰性匹配:/\d{1,3}?/,這樣,當(dāng)我們再去匹配剛才123456這個(gè)字符串的時(shí)候,他能匹配到的結(jié)果就是1。
1.2 縱向模糊匹配
縱向模糊是指匹配字符串中有某一位字符不是確定字符。
縱向匹配采用字符組的方式來實(shí)現(xiàn),譬如如下一個(gè)正則表達(dá)式:
/a[abc]c/可以匹配到的字符串有'aac','abc','acc'三種情況。
字符組的用法
字符組雖然叫組,但是只會(huì)取其中一個(gè)字符。
他的表示方法可以有以下幾種:
- 普通方式
就是前面提到過的[abc]的方式 - 范圍表示法
當(dāng)字符組里的數(shù)據(jù)特別多,而且具有一定順序的時(shí)候,我們就可以使用范圍表示法,比如說我們要使用字符'a'到'm',我們就可以使用連字符-來省略和簡寫,[a-m] - 排除法
如果我們需要對第一種情況進(jìn)行取反,比如字符可以是除了'a','b','c'以外的任何東西,我們可以使用^來取反[^abc],就像這樣,我們稱之為反義字符組(排除字符組)。 - 簡寫
最后就是簡寫,也就是上文的例子中有用到的比如\d的寫法就是簡寫中最為常見的一種,字符組的簡寫一般有以下幾種:
| 寫法 | 含義 |
|---|---|
| \d | 等價(jià)于[0-9],表示是一位數(shù)字。 |
| \D | 等價(jià)于[^0-9],表示除數(shù)字外的任何字符。 |
| \w | 等價(jià)于[0-9a-zA-Z_],表示數(shù)字,大小寫字母和下劃線。 |
| \W | 等價(jià)于[^0-9a-zA-Z_],表示出現(xiàn)一次或者不出現(xiàn)。 |
| \s | 等價(jià)于{1,},表示最少出現(xiàn)一次。 |
| \S | 等價(jià)于{0,},表示可以出現(xiàn)任意次,也可以不出現(xiàn)。 |
| . | 等價(jià)于{0,},表示可以出現(xiàn)任意次,也可以不出現(xiàn)。 |
分支選擇
可以采用|來進(jìn)行分隔,代表不同的模式
(p1|p2|p3),比如如下一個(gè)例子,/abc|123/既可以匹配abc也可以匹配123。
匹配位置
在正則的匹配中,還有一種就是位置匹配,正則中的位置我們可以理解為空字符串。
'hello' = '' + 'h'+''+'e'+''+'l'+''+'l'+''+'o'+''
這里使用空字符串的位置都可以算作是位置。
關(guān)于位置的匹配總共可以有以下六種匹配的方式:
| 寫法 | 含義 |
|---|---|
| ^ | 匹配開頭。 |
| $ | 匹配結(jié)尾。 |
| \b | 單詞邊界。 |
| \B | 和\b相反,非單詞邊界。 |
| (?=p) | p是一個(gè)子模式,這里代表p前面的位置。 |
| (?!p) | 就是(?=p)的反面,表示不是p的情況下的前面。 |
我們可以用一個(gè)例子來加深理解:
'hello world'.replace(/^/g,'$')
// $hello world
'hello world'.replace(/$/g,'$')
// hello world$
'hello world'.replace(/\b/g,'$')
// $hello$ $world$
'hello world'.replace(/\B/g,'$')
// h$e$l$l$o w$o$r$l$d
'hello world'.replace(/(?=l)/g,'$')
// he$l$lo wor$ld
'hello world'.replace(/(?!l)/g,'$')
// $h$ell$o$ $w$o$rl$d$