RegExp-正則表達(dá)式

正則表達(dá)式(Regular Expression)是計算機(jī)科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些符合某個模式的文本。

JavaScript通過內(nèi)置對象RegExp支持正則表達(dá)式,有兩種方式創(chuàng)建正則表達(dá)式對象

  1. 使用字面量,以斜杠表示開始和結(jié)束。
    var regex = /xyz/;
  2. 使用RegExp構(gòu)造函數(shù)
    var regex = new RegExp('xyz');
    以上兩種寫法是等價的,都新建了一個內(nèi)容為xyz的正則表達(dá)式對象。它們的主要區(qū)別是,第一種方法在編譯時新建正則表達(dá)式,第二種方法在運(yùn)行時新建正則表達(dá)式。

RegExp 構(gòu)造函數(shù)還可以接受第二個參數(shù),表示修飾符:

var regex = new RegExp('xyz', 'i');
var regex = /xyz/i;
//上面代碼中,正則表達(dá)式`/xyz/`有一個修飾符`i`

常用修飾符:

  1. g: global,全文搜索,不添加的話搜索到第一個結(jié)果停止搜索
  2. i: ingore case,忽略大小寫,默認(rèn)大小寫敏感
  3. m: multiple lines,多行搜索
元字符

在正則表達(dá)式中具有特殊意義的專用字符,可以用來規(guī)定其前導(dǎo)字符

字符 含義
\t 水平制表符
\r 回車符
\n 換行符
\f 換頁符
\v 垂直制表符
\0 空字符
字符類

一般情況下正則表達(dá)式一個字符(轉(zhuǎn)義字符算一個)對應(yīng)字符串一個字符,但是我們可以使用元字符[]來構(gòu)建一個簡單的類,比如[abcd]代表一個字符,這個字符可以是abcd四個字符中的任意一個.

取反

元字符[]組合可以創(chuàng)建一個類,我們還可以使用元字符^創(chuàng)建反向類/負(fù)向類,意思是不屬于這個類的內(nèi)容,表達(dá)式[^abc]表示一個不是字符a或b或c的字符。

范圍類

如何匹配單個字符

//匹配一個字符,這個字符可以是0-9中的任意一個
var reg1 = /0123456789/;
//匹配一個字符,這個字符可以是0-9中的任意一個
var reg2 = /[0-9]/;
//匹配一個字符,這個字符可以是a-z中的任意一個
var reg3 = /[a-z]/;
//匹配一個字符,這個字符可以是大寫字幕、小寫字母、數(shù)字中的任意一個
var reg4 = /[a-zA-Z0-9]/;
預(yù)定義類
字符 等價 類含義
. [^\r\n] 除了回車符和換行符之外的所有字符
\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ù)定義類,寫一些正則就很方便了,例如希望匹配一個可以是ab+數(shù)字+任意字符的字符串,就可以這樣寫\ab\d.

邊界

正則表達(dá)式還提供了幾個常用的邊界匹配字符

字符 含義
^ 以xxx開頭
$ 以xxx結(jié)尾
\b 單詞邊界
\B 非單詞邊界
var str = 'hello1 world hello2 123456 \t \r zuo \n dong hello3'
str.match(/hello\d/g)   // ["hello1", "hello2", "hello3"]
str.match(/^hello\d/g)  // ["hello1"]
str.match(/hello\d$/g)   // ["hello3"]

var str2 = 'hello1 whello9orld hello2 12-hello8-3456 \t \r zuo \n dong hello3'
str2.match(/\bhello\d\b/g)   //["hello1", "hello2", "hello8", "hello3"] 
//注意-也用于區(qū)分單詞邊界
量詞

如果我們希望匹配一個連續(xù)出現(xiàn)多次的字符串該怎么做呢,正則表達(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次
var str1 = 'http://zuodong.com'
str1.match(/https?:\/\/.+/)  //匹配
str1.match(/https+:\/\/.+/)  //不匹配
str1.match(/https*:\/\/.+/)  //匹配

var str2 = 'https://zuodong.com'
str2.match(/https?:\/\/.+/)  //匹配
str2.match(/https+:\/\/.+/g) //匹配
str2.match(/https*:\/\/.+/g) //匹配

var str3 = 'httpssssss://zuodong.com'
str3.match(/https?:\/\/.+/g)  //不匹配
str3.match(/https+:\/\/.+/g)  //匹配
str3.match(/https*:\/\/.+/g)  //匹配

實(shí)例演練

\d,\w, \s, [a-zA-Z0-9], \b, ., *, +, ?, x{3}, ^, $分別是什么?

\d:匹配數(shù)字字符[0-9]
\w:匹配單詞字符、字母、數(shù)字下劃線[a-zA-Z_0-9]
\s:匹配空白符[\t\n\x0B\f\r]
[a-zA-Z0-9]:匹配大小寫單詞字符、字母、數(shù)字
\b:單詞邊界
.:除了回車符和換行符之外的所有字符[^\r\n]
*:表示匹配一個連續(xù)出現(xiàn)多次的字符串的次數(shù),出現(xiàn)次數(shù)為任意次
+:表示匹配一個連續(xù)出現(xiàn)多次的字符串的次數(shù),出現(xiàn)次數(shù)為至少出現(xiàn)一次
?:表示匹配一個字符串,出現(xiàn)次數(shù)為最多一次
x{3}:匹配x字符,出現(xiàn)次數(shù)為3次
^:邊界匹配字符,以xxx開頭。在[]中使用表示取反
$:邊界匹配字符

寫一個函數(shù)trim(str),去除字符串兩邊的空白字符


注:匹配所有空白符并將其替換成空字符

寫一個函數(shù)isEmail(str),判斷用戶輸入的是不是郵箱


注:匹配以數(shù)字字母下劃線開頭多次加 @ 后接數(shù)字字母下劃線多次,以.com結(jié)尾

寫一個函數(shù)isPhoneNum(str),判斷用戶輸入的是不是手機(jī)號


注:匹配以13、15、17、18開頭后接9個數(shù)字的字符串

寫一個函數(shù)isValidUsername(str),判斷用戶輸入的是不是合法的用戶名(長度6-20個字符,只能包括字母、數(shù)字、下劃線)


注:匹配有字母數(shù)字下劃線,長度為6-20的字符串

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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