正則表達式是什么?
正則表達式是用于匹配字符串中字符組合的模式。簡單來說,用一種描述性語言去規定字符串的一種規則,如果符合,就匹配了,否則就是不匹配。
定義總是很枯燥不直觀,我們來舉個例子吧。假如你想從"hi my friend"里找出hi
單詞,我們定義正則表達式:/hi/
,比如你想匹配三位數字 123,235等,你可以定義表達式/\d\d\d/
,這里的\d
我們稱為元字符,它含義是匹配一個數字字符,那這里是3個\d
所以就可以匹配3個數字,是不是很簡單啊。
\d{3}表示匹配3個數字,例如'010';
\d{3,8}表示3-8個數字,例如'1234567'。
'00\d'可以匹配'007',但無法匹配'00A';
這里的{}
也是元字符,后面會介紹。
正則表達式基本語法
既然是一種描述性語言,那么就有自己特殊的語法,所以需要大致記憶一下。當然使用的多了,自然就熟悉了。
元字符
具有特殊意義的正則表達式,這樣可以更好描述需要匹配的字符串。
上面介紹過\d
匹配一個數字字符,還有\w
匹配一個單字字符(字母、數字或者下劃線),\s
匹配任意的空白符.
.
(小數點)匹配除換行符之外的任何單個字符。
例如.b
,就會匹配“bcd abc”中的ab
,而不會匹配bc
\b\w{6}\b 匹配6個字符的單詞,{6}
重復6次
^
和$
都表示匹配一個位置,^
表示字符串開頭位置,$
表示字符串結尾,例如我們匹配QQ號^\d{5,12}$
,{5,12}
重復5到12次,因為前后匹配位置,所以必須輸入5到12位數字才能匹配。
限定符
表示前面正則字符重復的次數
例如:
bc*
匹配 “bc”或“bcccccccccccccc”
a+/
匹配了在 "candy" 中的 'a',和在 "caaaaaaandy" 中所有的 'a'
e?le?
匹配 "angel" 中的 'el',和 "angle" 中的 'le' 以及"oslo' 中的'l'。
定位符
定位符用來描述字符串或單詞的邊界
例如你要尋找字符串中hi
,但是如果沒有設置單詞邊界,就有可能匹配出him,history,high
,但是使用\bhi\b
就只會匹配hi
單詞。
而/B其實是\b的取反,oo\B
可以匹配“foot”里的oo
字符轉義
如果你想查找本身具有特殊意義的元字符,如果直接使用就會產生問題,這時你就得使用\
來取消這些字符的特殊意義。
因此,你應該使用\.
和\*
。當然,要查找\本身,你也得用\\
.
字符類
有的時候我只是想找元音字母a,e,i,o,u
,其他字母不需要怎么辦?很明顯\w
不適合的。
那我們應該自定義自己需要的字符集[a,e,i,o,u]
, 其實\d
等于[0-9]
,而\w
等于[a-z0-9A-Z_]
分枝條件
x|y
你可以理解為邏輯運算里“或”
例如:
green|red
匹配“green apple”中的‘green’和“red apple”中的‘red’
分組
我們可以重復單個字符多次,但是怎么可以重復多個字符多次呢??你可以用小括號()
來指定子表達式(也叫做分組),然后你就可以指定這個子表達式的重復次數了
模式 (foo) (bar) \1 \2
中的 '(foo)' 和 '(bar)' 匹配并記住字符串 "foo bar foo bar"
中前兩個單詞,每個小括號表示一個分組,1和2是組號而\1
表示第一個分組匹配。
例如:\b(\w+)\b\s+\1\b
可以用來匹配重復的單詞,像go go
, 或者kitty kitty
貪婪與懶惰
正則表達式默認是盡可能匹配多的字符,以這個表達式為例:a.*b
,這樣,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab
的話,它會匹配整個字符串aabab
。這被稱為貪婪匹配
。
但是很明顯有時候我們需要盡可能匹配少的字符,那我們可以加限定符?
,
a.*?b
,這樣如果用它來搜索aabab
的話,它會匹配整個字符串aab
和ab
標志
正則表達式有四個可選參數進行全局和不分大小寫搜索。這些參數既可以單獨使用也可以一起使用在任何順序和包含正則表達式的部分中。
使用正則表達式
創建一個正則表達式
- 正則表達式字面量
/*
/pattern/flags
*/
const regex = /ab+c/;
const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;
- 調用RegExp對象的構造函數
/*
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");
使用正則表達式的方法
正則表達式可以被用于RegExp的exec和test方法以及 String的match、replace、search和split方法。
個人水平有限,如有錯誤,還望指正,感激不盡!!!