正則表達(dá)式是什么垂寥?
正則表達(dá)式是用于匹配字符串中字符組合的模式。簡(jiǎn)單來說另锋,用一種描述性語言去規(guī)定字符串的一種規(guī)則滞项,如果符合,就匹配了夭坪,否則就是不匹配蓖扑。
定義總是很枯燥不直觀,我們來舉個(gè)例子吧台舱。假如你想從"hi my friend"里找出hi
單詞律杠,我們定義正則表達(dá)式:/hi/
,比如你想匹配三位數(shù)字 123竞惋,235等柜去,你可以定義表達(dá)式/\d\d\d/
,這里的\d
我們稱為元字符,它含義是匹配一個(gè)數(shù)字字符拆宛,那這里是3個(gè)\d
所以就可以匹配3個(gè)數(shù)字嗓奢,是不是很簡(jiǎn)單啊。
\d{3}表示匹配3個(gè)數(shù)字浑厚,例如'010'股耽;
\d{3,8}表示3-8個(gè)數(shù)字,例如'1234567'钳幅。
'00\d'可以匹配'007'物蝙,但無法匹配'00A';
這里的{}
也是元字符敢艰,后面會(huì)介紹诬乞。
正則表達(dá)式基本語法
既然是一種描述性語言,那么就有自己特殊的語法钠导,所以需要大致記憶一下震嫉。當(dāng)然使用的多了,自然就熟悉了牡属。
元字符
具有特殊意義的正則表達(dá)式票堵,這樣可以更好描述需要匹配的字符串。
上面介紹過\d
匹配一個(gè)數(shù)字字符逮栅,還有\w
匹配一個(gè)單字字符(字母悴势、數(shù)字或者下劃線),\s
匹配任意的空白符.
.
(小數(shù)點(diǎn))匹配除換行符之外的任何單個(gè)字符窗宇。
例如.b
,就會(huì)匹配“bcd abc”中的ab
,而不會(huì)匹配bc
\b\w{6}\b 匹配6個(gè)字符的單詞,{6}
重復(fù)6次
^
和$
都表示匹配一個(gè)位置瞳浦,^
表示字符串開頭位置,$
表示字符串結(jié)尾废士,例如我們匹配QQ號(hào)^\d{5,12}$
,{5,12}
重復(fù)5到12次叫潦,因?yàn)榍昂笃ヅ湮恢茫员仨気斎?到12位數(shù)字才能匹配官硝。
限定符
表示前面正則字符重復(fù)的次數(shù)
例如:
bc*
匹配 “bc”或“bcccccccccccccc”
a+/
匹配了在 "candy" 中的 'a'矗蕊,和在 "caaaaaaandy" 中所有的 'a'
e?le?
匹配 "angel" 中的 'el',和 "angle" 中的 'le' 以及"oslo' 中的'l'氢架。
定位符
定位符用來描述字符串或單詞的邊界
例如你要尋找字符串中hi
傻咖,但是如果沒有設(shè)置單詞邊界,就有可能匹配出him,history,high
,但是使用\bhi\b
就只會(huì)匹配hi
單詞岖研。
而/B其實(shí)是\b的取反卿操,oo\B
可以匹配“foot”里的oo
字符轉(zhuǎn)義
如果你想查找本身具有特殊意義的元字符,如果直接使用就會(huì)產(chǎn)生問題孙援,這時(shí)你就得使用\
來取消這些字符的特殊意義害淤。
因此,你應(yīng)該使用\.
和\*
拓售。當(dāng)然窥摄,要查找\本身,你也得用\\
.
字符類
有的時(shí)候我只是想找元音字母a,e,i,o,u
础淤,其他字母不需要怎么辦?很明顯\w
不適合的崭放。
那我們應(yīng)該自定義自己需要的字符集[a,e,i,o,u]
, 其實(shí)\d
等于[0-9]
,而\w
等于[a-z0-9A-Z_]
分枝條件
x|y
你可以理解為邏輯運(yùn)算里“或”
例如:
green|red
匹配“green apple”中的‘green’和“red apple”中的‘red’
分組
我們可以重復(fù)單個(gè)字符多次,但是怎么可以重復(fù)多個(gè)字符多次呢鸽凶?币砂?你可以用小括號(hào)()
來指定子表達(dá)式(也叫做分組),然后你就可以指定這個(gè)子表達(dá)式的重復(fù)次數(shù)了
模式 (foo) (bar) \1 \2
中的 '(foo)' 和 '(bar)' 匹配并記住字符串 "foo bar foo bar"
中前兩個(gè)單詞,每個(gè)小括號(hào)表示一個(gè)分組玻侥,1和2是組號(hào)而\1
表示第一個(gè)分組匹配道伟。
例如:\b(\w+)\b\s+\1\b
可以用來匹配重復(fù)的單詞,像go go
, 或者kitty kitty
貪婪與懶惰
正則表達(dá)式默認(rèn)是盡可能匹配多的字符使碾,以這個(gè)表達(dá)式為例:a.*b
,這樣蜜徽,它將會(huì)匹配最長(zhǎng)的以a開始,以b結(jié)束的字符串票摇。如果用它來搜索aabab
的話拘鞋,它會(huì)匹配整個(gè)字符串aabab
。這被稱為貪婪匹配
矢门。
但是很明顯有時(shí)候我們需要盡可能匹配少的字符盆色,那我們可以加限定符?
,
a.*?b
,這樣如果用它來搜索aabab
的話灰蛙,它會(huì)匹配整個(gè)字符串aab
和ab
標(biāo)志
正則表達(dá)式有四個(gè)可選參數(shù)進(jìn)行全局和不分大小寫搜索。這些參數(shù)既可以單獨(dú)使用也可以一起使用在任何順序和包含正則表達(dá)式的部分中隔躲。
使用正則表達(dá)式
創(chuàng)建一個(gè)正則表達(dá)式
- 正則表達(dá)式字面量
/*
/pattern/flags
*/
const regex = /ab+c/;
const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;
- 調(diào)用RegExp對(duì)象的構(gòu)造函數(shù)
/*
new RegExp(pattern [, flags])
*/
let regex = new RegExp("ab+c");
let regex = new RegExp(/^[a-zA-Z]+[0-9]*\W?_$, "gi");
let regex = new RegExp("^[a-zA-Z]+[0-9]*\W?_$", "gi");
使用正則表達(dá)式的方法
正則表達(dá)式可以被用于RegExp的exec和test方法以及 String的match摩梧、replace、search和split方法宣旱。
個(gè)人水平有限仅父,如有錯(cuò)誤,還望指正浑吟,感激不盡s舷恕!组力!