正則表達(dá)式系列基本用法

正則對(duì)象

生成正則對(duì)象

有兩種方法可以創(chuàng)建并得到一個(gè)正則表達(dá)式對(duì)象

字面量聲明方式

var reg = /abc/g;

顯式創(chuàng)建

var reg =new RegExp("abc", "g");

可選項(xiàng)標(biāo)記

上文生成正則對(duì)象中最后有用到g巫湘,其實(shí)這就是生成正則的可選項(xiàng)標(biāo)記,可以組合使用士复,如下

g 全文匹配探熔,即匹配一個(gè)成功后被因,如果沒有結(jié)束拢蛋,會(huì)繼續(xù)匹配

i 忽略大小寫匹配

m 多行匹配

可以通過如下示例進(jìn)一步了解

/g的用法

加上/g后會(huì)全局搜索所有匹配結(jié)果

var str = 'abcabcabc';

// ['abc', index: 0, input: "abcabcabc"]

str.match(/abc/);

// ['abc', 'abc', 'abc']

str.match(/abc/g);

/i的用法

加上/i后大小寫一視同仁玄妈,很多時(shí)候凰荚,如果不加/i曲伊,很容易出現(xiàn)大小寫不匹配的錯(cuò)誤(比如去除字符串中script標(biāo)簽時(shí))

var str = 'Script';

// null

str.match(/script/);

// ["Script", index: 0, input: "Script"]

str.match(/script/i);

/m的用法

多行匹配比較少用到叽讳,但在一些場(chǎng)景下不得不用,比如下例中熊昌,只有\(zhòng)m多行匹配的情況下才能正常的將每一行的行尾(\n形成不同的行)的數(shù)字替換成#绽榛,否則默認(rèn)會(huì)認(rèn)為只有一行

var str = 'a1\nb1\nc1\nd1\ne1\nf1';

/**

* a1

* b1

* c1

* d1

* e1

* f#

*/

str.replace(/\d+$/g, '#')

/**

* a#

* b#

* c#

* d#

* e#

* f#

*/

str.replace(/\d+$/mg, '#')

子表達(dá)式

正則表達(dá)式中,用圓括號(hào)包圍的就是子表達(dá)式(子模式)

一般婿屹,在match的非全局匹配中或exec中灭美,在匹配完整個(gè)正則表達(dá)表達(dá)式后,都會(huì)再次匹配子表達(dá)式

另外昂利,在字符串的replace與split中届腐,子表達(dá)式也會(huì)經(jīng)常用到

var str = 'a1.b2.c3.d4';

// 第一個(gè)結(jié)果是 整個(gè)正則表達(dá)式的匹配,之后則分別是子表達(dá)式的匹配

/(\w)(\d)[.]/.exec(str); // ["a1.", "a", "1", index: 0, input: "a1.b2.c3.d4"]

正則的test()

pattern.test(str);

檢索字符串中是否存在指定模式蜂奸,匹配成功則返回true犁苏,否則返回false

var str = 'abcdefg';

/^abc/.test(str); // true

/^abce/.test(str); // false

正則的compile()

reg.compile(pattern);

編譯正則表達(dá)式,編譯之后正則的執(zhí)行速度會(huì)提高

編譯的時(shí)候也可以改變檢索模式或者改變可選項(xiàng)標(biāo)識(shí)

var str = 'abcdabcdabc';

var reg = /abc/;

reg.test(str)扩所; // true

reg.compile();

reg.test(str)围详; // true,僅僅是被編譯祖屏,沒有被改變

reg.compile(/aB/);

reg.test(str)助赞; // false,匹配式改成了aB袁勺,因此不匹配

reg.compile(/aB/i);

reg.test(str)雹食; // true,改成了aB并且忽略大小的形式期丰,因此匹配

正則的exec()

pattern.exec(str);

在字符串中檢索特定的模式群叶,匹配成功則返回找到的值吃挑,否則返回null

有兩種情況

第一種:非全局匹配

如果沒有找到,則返回null

找到則返回一個(gè)數(shù)組街立,arr[0]是匹配結(jié)果舶衬,余下元素是arr[0]中匹配圓括號(hào)中子表達(dá)式的結(jié)果,以及最后的index和input

而且非全局模式中几晤,不會(huì)保存index约炎,也就是說不管匹配多少次,結(jié)果都是一樣的

var str = 'a1.b2.c3.d4';

var reg1 = /(\w)(\d)[.]/;

reg1.exec(str); // ["a1.", "a", "1", index: 0, input: "a1.b2.c3.d4"]

reg1.exec(str); // ["a1.", "a", "1", index: 0, input: "a1.b2.c3.d4"]

reg1.exec(str); // ["a1.", "a", "1", index: 0, input: "a1.b2.c3.d4"]

/abc/.exec(str); // null

第二種:g全局匹配

正則的exec全局匹配可以保存index蟹瘾,并且下一次繼續(xù)匹配時(shí),將不會(huì)是重新從0開始掠手,而是從保存的index開始

var str = 'a1.b2.c3.d4';

var reg2 = /(\w)(\d)[.]/g;

reg2.exec(str); // ["a1.", "a", "1", index: 0, input: "a1.b2.c3.d4"]

reg2.exec(str); // ["b2.", "b", "2", index: 3, input: "a1.b2.c3.d4"]

reg2.exec(str); // ["c3.", "c", "3", index: 6, input: "a1.b2.c3.d4"]

/abc/.exec(str); // null

字符串的正則應(yīng)用

上文中提到的都是正則對(duì)象上的方法憾朴,但實(shí)際上,JS的String對(duì)象也支持正則表達(dá)式

字符串的match()

match是字符串中最常用的方法

str.match(pattern);

如果pattern中有g(shù)喷鸽,代表全局匹配众雷,則返回的數(shù)組包含所有匹配結(jié)果

如果無g,則返回的數(shù)組的第1個(gè)元素(arr[0])是第一個(gè)匹配結(jié)果做祝,余下元素是arr[0]中匹配圓括號(hào)中子表達(dá)式的結(jié)果

var str = 'a.b2.c3.d445.e';

str.match(/\d[.]/); // ["2.", index: 3, input: "a.b2.c3.d445.e"]

// 非全局匹配下砾省,并且有圓括號(hào)子表達(dá)式,先匹配整個(gè)正則表達(dá)式一次

// 然后在匹配結(jié)果中再匹配子表達(dá)式

str.match(/(\d)[.]/); // ["2.", "2", index: 3, input: "a.b2.c3.d445.e"]

// g 模式下是對(duì)整個(gè)正則表達(dá)式(包括圓括號(hào)子表達(dá)式)進(jìn)行全局匹配

str.match(/(\d)[.]/g); // ["2.", "3.", "5."]

字符串的replace()

字符串中用來快速替換的方法混槐,有多種用法

第一種情況

str.replace(str1, str2);

第一個(gè)參數(shù)是字符串编兄,那么返回的結(jié)果只有str1被替換成str2了

var str = 'a.b2.c3.d4';

// 只會(huì)替換 . 一次

str.replace('.', '#'); // a#b2.c3.d445.e

第二種情況

str.replace(pattern, str2);

第一個(gè)參數(shù)是正則表達(dá)式,此時(shí)如果是g全局匹配模式声登,會(huì)替換所有的匹配結(jié)果為str2狠鸳,否則只會(huì)替換一個(gè)匹配結(jié)果

var str = 'a.b2.c3.d4';

str.replace(/[.]/, '#'); // a#b2.c3.d445.e

str.replace(/[.]/g, '#'); // a#b2#c3#d445#e

另外此模式下,str2還可以使用一些有特殊含義的特殊字符悯嗓,例如

var str = 'a1.b2.c3.d4';

// $2和$1分別代表第2個(gè),第1個(gè)子表達(dá)式

str.replace(/(\w)(\d)[.]*/g, '$2$1~'); // 1a~2b~3c~4d~

str2中可用的特殊字符表

字符???????????? 替換

$1,$2,...,$99 ? 匹配第1~99個(gè)pattern中的圓括號(hào)子表達(dá)式的文本

$& ? ? ? ? ? ? ? 匹配pattern的子串

$` ? ? ? ? ? ? ?? 匹配子串的左邊文本

$' ? ? ? ? ? ? ?? 匹配子串的右邊文本

$$ ? ? ? ? ? ? ? 美元符號(hào)

第三種情況

str.replace(pattern, func);

這種模式下件舵,第二個(gè)參數(shù)為一個(gè)函數(shù),func將會(huì)在每一個(gè)匹配結(jié)果中調(diào)用脯厨,func返回的字符串將作為替換文本铅祸,func接收的參數(shù),第一個(gè)是匹配pattern的字符串合武,之后的參數(shù)(可能是多個(gè))是匹配該pattern中某個(gè)圓括號(hào)子表達(dá)式的字符串临梗,在這之后的參數(shù)就是index(匹配結(jié)果的位置),再之后就是完整的input

var str = a1.b2.c3.d4;

// 最終結(jié)果為: 1a~2b~3c~4d~

str.replace(/(\w)(\d)[.]*/g, function(word, child1, child2, index, input) {

console.log(word); // 依次打印的是a1. b2. c3. d4

console.log(child1); // 依次打印的是a b c d

console.log(child2); // 依次打印的是1 2 3 4

console.log(index); // 依次打印的是0 3 6 9

console.log(input); // 每次都是打印 a1.b2.c3.d4

return child2 + child1 + '~';

});

字符串的search()

返回第1個(gè)與patten匹配的字符串子串的起始位置眯杏,如果找不到夜焦,則返回-1,不支持全局檢索岂贩,也就是說茫经,會(huì)省略g

var str = 'abcdefg1234567';

str.search(/efg/); // 4

str.search(/efg/g); // 4

str.search(/aabc/g); // -1

字符串的split()

split方法可以讓一個(gè)字符串分割成數(shù)組巷波,同樣忽略g

str.split(pattern, limit); // pattern為字符串或正則

將str拆分為子串組成的數(shù)組,子串中不包括pattern(特例除外)卸伞。limit是可選參數(shù)抹镊,指定返回的數(shù)組的最大長(zhǎng)度

特例: 如果pattern包含圓括號(hào)子表達(dá)式,則匹配這個(gè)圓括號(hào)子表達(dá)式的子串(不是匹配整個(gè)正則)會(huì)包含在返回?cái)?shù)組中

var str = 'a1.b2.c3.d4';

str.split(/\d[.]/); // ["a", "b", "c", "d4"]

// 包含了圓括號(hào)的子串荤傲,返回?cái)?shù)組中出現(xiàn)了匹配圓括號(hào)的子串

str.split(/(\d)[.]/); // ["a", "1", "b", "2", "c", "3", "d4"]

var str2 = '.b2.c3.';

// 3.后面沒有字符了冀值,但是由于它符合匹配,所以后續(xù)結(jié)果中會(huì)多一個(gè)""

str2.split(/\d[.]/); // [".b", "c", ""]

// 同上慎式,只不過圓括號(hào)中的內(nèi)容也在返回結(jié)果中

str.split(/(\d)[.]/); // [".b", "2", "c", "3", ""]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末安接,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雾家,更是在濱河造成了極大的恐慌铃彰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芯咧,死亡現(xiàn)場(chǎng)離奇詭異牙捉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敬飒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門邪铲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人无拗,你說我怎么就攤上這事带到。” “怎么了蓝纲?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵阴孟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我税迷,道長(zhǎng)永丝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任箭养,我火速辦了婚禮慕嚷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毕泌。我一直安慰自己喝检,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布撼泛。 她就那樣靜靜地躺著挠说,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愿题。 梳的紋絲不亂的頭發(fā)上损俭,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天蛙奖,我揣著相機(jī)與錄音,去河邊找鬼杆兵。 笑死雁仲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琐脏。 我是一名探鬼主播攒砖,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼日裙!你這毒婦竟也來了吹艇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤阅签,失蹤者是張志新(化名)和其女友劉穎掐暮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體政钟,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年樟结,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了养交。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓢宦,死狀恐怖碎连,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驮履,我是刑警寧澤鱼辙,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站玫镐,受9級(jí)特大地震影響倒戏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恐似,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一杜跷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矫夷,春花似錦葛闷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忧陪,卻和暖如春扣泊,著一層夾襖步出監(jiān)牢的瞬間近范,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工旷赖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顺又,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓等孵,卻偏偏與公主長(zhǎng)得像稚照,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俯萌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • RegExp 三大方法本文的RegExp采用直接量語法表示:/pattern/attributes果录。attribu...
    恩德_b0c2閱讀 455評(píng)論 0 0
  • 什么是正則表達(dá)式?如何創(chuàng)建正則表達(dá)式正則表達(dá)式常用的方法字符串中的正則表達(dá)式常用的正則表達(dá)式假設(shè)用戶需要在HTML...
    greenlift閱讀 805評(píng)論 0 0
  • re模塊手冊(cè) 本模塊提供了和Perl里的正則表達(dá)式類似的功能咐熙,不關(guān)是正則表達(dá)式本身還是被搜索的字符串弱恒,都可以...
    喜歡吃栗子閱讀 3,990評(píng)論 0 13
  • 這本書足夠出名,也足夠經(jīng)典棋恼,我也足夠吃了苦頭返弹,啃到深夜。亦苦亦甜爪飘。文章以豐富資料支撐义起,化以三言兩語簡(jiǎn)短的案例而附注...
    你好喬納森閱讀 408評(píng)論 0 3
  • 不知道是怎么了,總會(huì)有些這樣那樣的困惑师崎,人與人之間也會(huì)因?yàn)檫@樣那樣的事情略顯尷尬默终。 清早換了一套輕熟的連衣裙,同事...
    沸水里的魚閱讀 419評(píng)論 0 1