RegExp-正則表達(dá)式

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

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

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

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

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

常用修飾符:

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

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

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

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

取反

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

范圍類

如何匹配單個(gè)字符

//匹配一個(gè)字符,這個(gè)字符可以是0-9中的任意一個(gè)
var reg1 = /0123456789/;
//匹配一個(gè)字符挫剑,這個(gè)字符可以是0-9中的任意一個(gè)
var reg2 = /[0-9]/;
//匹配一個(gè)字符去扣,這個(gè)字符可以是a-z中的任意一個(gè)
var reg3 = /[a-z]/;
//匹配一個(gè)字符,這個(gè)字符可以是大寫字幕樊破、小寫字母愉棱、數(shù)字中的任意一個(gè)
var reg4 = /[a-zA-Z0-9]/;
預(yù)定義類
字符 等價(jià) 類含義
. [^\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ù)定義類奔滑,寫一些正則就很方便了,例如希望匹配一個(gè)可以是ab+數(shù)字+任意字符的字符串惫恼,就可以這樣寫\ab\d.

邊界

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

字符 含義
^ 以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ū)分單詞邊界
量詞

如果我們希望匹配一個(gè)連續(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]
*:表示匹配一個(gè)連續(xù)出現(xiàn)多次的字符串的次數(shù)粒没,出現(xiàn)次數(shù)為任意次
+:表示匹配一個(gè)連續(xù)出現(xiàn)多次的字符串的次數(shù),出現(xiàn)次數(shù)為至少出現(xiàn)一次
?:表示匹配一個(gè)字符串簇爆,出現(xiàn)次數(shù)為最多一次
x{3}:匹配x字符癞松,出現(xiàn)次數(shù)為3次
^:邊界匹配字符,以xxx開頭入蛆。在[]中使用表示取反
$:邊界匹配字符

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


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

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


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

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


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

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


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末食店,一起剝皮案震驚了整個(gè)濱河市渣淤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叛买,老刑警劉巖砂代,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋订,死亡現(xiàn)場離奇詭異率挣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)露戒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門椒功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人智什,你說我怎么就攤上這事动漾。” “怎么了荠锭?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵旱眯,是天一觀的道長。 經(jīng)常有香客問我证九,道長删豺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任愧怜,我火速辦了婚禮呀页,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拥坛。我一直安慰自己蓬蝶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布猜惋。 她就那樣靜靜地躺著丸氛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪著摔。 梳的紋絲不亂的頭發(fā)上缓窜,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音梨撞,去河邊找鬼雹洗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卧波,可吹牛的內(nèi)容都是我干的时肿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼港粱,長吁一口氣:“原來是場噩夢啊……” “哼螃成!你這毒婦竟也來了旦签?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤寸宏,失蹤者是張志新(化名)和其女友劉穎宁炫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氮凝,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羔巢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罩阵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竿秆。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稿壁,靈堂內(nèi)的尸體忽然破棺而出幽钢,到底是詐尸還是另有隱情,我是刑警寧澤傅是,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布匪燕,位于F島的核電站,受9級特大地震影響喧笔,放射性物質(zhì)發(fā)生泄漏帽驯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一溃斋、第九天 我趴在偏房一處隱蔽的房頂上張望界拦。 院中可真熱鬧,春花似錦梗劫、人聲如沸享甸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛉威。三九已至,卻和暖如春走哺,著一層夾襖步出監(jiān)牢的瞬間蚯嫌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工丙躏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留择示,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓晒旅,卻偏偏與公主長得像栅盲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子废恋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容