前端正則表達(dá)式淺析

今天簡單來講一講正則,尤其是一些我們在前端開發(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è)字符。
他的表示方法可以有以下幾種:

  1. 普通方式
    就是前面提到過的[abc]的方式
  2. 范圍表示法
    當(dāng)字符組里的數(shù)據(jù)特別多,而且具有一定順序的時(shí)候,我們就可以使用范圍表示法,比如說我們要使用字符'a''m',我們就可以使用連字符-來省略和簡寫,[a-m]
  3. 排除法
    如果我們需要對第一種情況進(jìn)行取反,比如字符可以是除了'a''b','c'以外的任何東西,我們可以使用^來取反[^abc],就像這樣,我們稱之為反義字符組(排除字符組)。
  4. 簡寫
    最后就是簡寫,也就是上文的例子中有用到的比如\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$
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容