前端正則表達(dá)式基本語(yǔ)法

正則表示式在線測(cè)試工具網(wǎng)站动遭,并以圖例的方式呈現(xiàn)正則表達(dá)式:regexper.com
本文章內(nèi)容通過(guò)學(xué)習(xí)Samaritan89老師的網(wǎng)課而總結(jié)的知識(shí)點(diǎn)

  1. RegExp對(duì)象
  2. 元字符
  3. 字符類
  4. 范圍類
  5. 預(yù)定義類及邊界
  6. 量詞
  7. 正則貪婪模式與非貪婪模式
  8. 分組
  9. 前瞻
  10. 正則表達(dá)式的對(duì)象屬性
  11. 正則表達(dá)式對(duì)象方法
  12. 跟正則表達(dá)式非常相關(guān)的字符串對(duì)象方法

1. RegExp對(duì)象


實(shí)例化RegExp對(duì)象有一下兩種方法

  • 使用字面量實(shí)例化
    var reg = /\bis\b/
    'He is a boy. This is a dogis.'.replace(reg,'IS')
    //He IS a boy. This is a dogis.
    var reg = /\bis\b/g
    'He is a boy. This is a dogis.'.replace(reg,'IS')
    //He IS a boy. This IS a dogis.
    
  • 使用構(gòu)造函數(shù)實(shí)例化
    //使用構(gòu)造函數(shù)實(shí)例化
    var reg = new RegExp('\\bis\\b','g')
    'He is a boy. This is a dogis.'.replace(reg,'IS')
    //He IS a boy. This IS a dogis.
    var reg = /\bis\b/gi
    'He Is a boy. This Is a dogis.'.replace(reg,'0')
    //He 0 a boy. This 0 a dogis.
    

正則的修飾符有以下幾種:

符號(hào) 解釋 默認(rèn)值
g global 全文搜索 fasle,默認(rèn)搜索到第一個(gè)匹配停止
i ignore case 忽略大小寫(xiě) false牵现,默認(rèn)大小寫(xiě)敏感
m multiple lines 多行搜索 false窗价,默認(rèn)不匹配多行


2. 元字符


正則表達(dá)式由兩種基本字符類型組成:

  1. 原義wenbenzifu
  2. 元字符

元字符是在正則表達(dá)式中有特殊含義的非子母字符
常用的有:* + ? $ ^ . \ () {} [] 岛请,這些在下文篇幅中一一講述杨蛋,以及以下常用字符:

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


3. 字符類


類:指符合某些特性的對(duì)象,是個(gè)泛指
元字符[ ] 匹配某類字符
例子:

'a1b2c3d4'.replace(/[abc]/g,'X')
//X1X2X3d4

在類[]中珍德,使用元字符^創(chuàng)建反向類/負(fù)向類,如下:

//表達(dá)式[^abc]表示不是字符a或b或c的內(nèi)容
'a1b2c3d4'.replace(/[^abc]/g,'X')
//aXbXcXXX


4. 范圍類


正則表達(dá)式提供的范圍類旦棉,如
[a-z]來(lái)連接兩個(gè)字符,表示從a到z的任意字符禾蚕,此表達(dá)的是閉區(qū)間您朽,包括a和z
例子:

'a1b2c3x4z9'.replace(/[a-z]/g,'P')
// P1P2P3P4P9

在[ ] 組成的類內(nèi)部是可以連寫(xiě)的[a-zA-Z]

'Aa1Bb2c3x4z9ASDFQW'.replace(/[a-zA-Z]/g,'P')
//"PP1PP2P3P4P9PPPPPP"

匹配數(shù)字和橫線,即再單加一個(gè)-

'2019-03-09'.replace(/[0-9-]/g,'P')
//PPPPPPPPPP


5. 預(yù)定義類及邊界


5.1 預(yù)定義類

預(yù)定義類是為了匹配常見(jiàn)的的字符類

字符 等價(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 [^-zA-Z_0-9] 非單詞字符

例子:匹配 ab+數(shù)字+任意字符 的字符串
/ab\d./等價(jià)于 /ab[0-9][^\r\n]/

5.2邊界匹配字符####

字符 含義
^ 以xxx開(kāi)始
$ 以xxx結(jié)束
\b 單詞邊界
\B 非單詞邊界

單詞邊界和非單詞邊界例子:

'This is a boy'.replace(/is/g,'0')
//Th0 0 a boy
'This is a boy'.replace(/\bis\b/g,'0')
//This 0 a boy
'This is a boy'.replace(/\Bis\b/g,'0')
//Th0 is a boy

字符串的首尾匹配例子:

'@123@abc@'.replace(/@./g,'Q')
//Q23Qbc@
'@123@abc@'.replace(/^@./g,'Q')
// Q3@abc@
'@123@abc@'.replace(/.@/g,'Q')
// @12QabQ
'@123@abc@'.replace(/.@$/g,'Q')
//@123@abQ

多行字符串的每行首尾匹配例子

'@123\n@456\n@789'.replace(/^@\d/g,'X')
//X23\n@456\n@789
'@123\n@456\n@789'.replace(/^@\d/gm,'X')
//X23\nX56\nX89


6. 量詞


例子:匹配一個(gè)連續(xù)出現(xiàn)5次數(shù)字的字符串
/\d\d\d\d\d/等價(jià)于/\d{20}/
量詞字符如下

字符 含義
? 出現(xiàn)零次或一次(最多一次)
+ 出現(xiàn)一次或多次(最少一次)
* 出現(xiàn)零次或多次(任意次)
{n} 出現(xiàn)n次
{n,m} 出現(xiàn)n到m次
{n,} 最少出現(xiàn)n次

例子:

'12343432'.replace(/\d?/,'z')
// "z2343432"
'12343432'.replace(/\d+/,'z')
// "z"   為什么匹配所有的數(shù)組,而不是匹配一個(gè)倍试?看下一篇幅講述
'12343432'.replace(/\d*/,'z')
// "z"
'12343432'.replace(/\d{4}/,'z')
// "43432"
'12343432'.replace(/\d{4,7}/,'z')
// "z2"
'12343432'.replace(/\d{4,}/,'z')
// "z"


7. 正則貪婪模式與非貪婪模式


一般情況下讯屈,正則是默認(rèn)盡可能的匹配,即貪婪模式县习,如下例子

'12345678'.replace(/\d{3,6}/,'z')
//z78

開(kāi)啟非貪婪模式的方法:在量詞后面添加問(wèn)號(hào)

'12345678'.replace(/\d{3,6}?/,'z')
//z45678
'12345678'.replace(/\d{3,6}?/g,'z')
//zz78


8. 分組


8.1分組 ()

使用場(chǎng)景:匹配字符串連續(xù)出現(xiàn)三次的場(chǎng)景
例如:/Byron{3}/只能匹配連續(xù)3次的n涮母,單詞不重復(fù)
所以可以使用 元字符() 達(dá)到分組的功能,使量詞作用域分組

var reg = /(Byron){3}/
'a1b2c3d4'.replace(/[a-z]\d{3}/g,'X')
// "a1b2c3d4"
'a1b2c3d4'.replace(/([a-z]\d){3}/g,'X')
// "Xd4"
8.2 或 |

使用 元字符| 達(dá)到或的效果躁愿,而不需要分組

'ByronCasper'.replace(/Byron|Casper/g,'X')
// "XX"

也可以在分組中使用

'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g,'X')
// "XX"
8.3 反向引用

反向引用可以捕獲分組內(nèi)容叛本,用$n(n表示第n個(gè)分組)表示,同時(shí)$&表示整個(gè)正則表達(dá)式匹配的內(nèi)容.例子如下:

'2019-03-10'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1')
// "03/10/2019"
'2019-03-10'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'時(shí)間:$&')
//"時(shí)間:2019-03-10"
8.4 忽略分組

如不希望捕獲某些分組彤钟,需在分組的前面加上?:来候,例子:

'Byron1ok'.replace(/(?:Byron).(ok)/,'$1')
// "ok"


9. 前瞻


而前瞻就是在正則表達(dá)式匹配到規(guī)則的時(shí)候,向檢查是否符合斷言逸雹。
對(duì)的解釋:從文本頭部向尾部開(kāi)始解析营搅,文本尾部方向,稱為‘前’梆砸。
后顧/后瞻方向與之方向相反转质,但是javascript不支持后顧
前瞻中的正則表達(dá)式稱為斷言,又分為肯定/正向匹配和否定/負(fù)向匹配

名稱 正則 含義
正向前瞻 exp(?=assert) 匹配到exp后帖世,其后面字符是否能匹配assert的正則
負(fù)向前瞻 exp(?!assert) 匹配到exp后峭拘,其后面字符是否不能匹配assert的正則

例子:

'a2*34vv'.replace(/\w(?=\d)/g, 'X')
 //X2*X4vv
 'a2*34vv'.replace(/\w(?!\d)/g, 'X')
//aX*3XXX


10. 正則表達(dá)式的對(duì)象屬性


  1. global:是否全文搜索,默認(rèn)為false
  2. ignore case:是否大小寫(xiě)敏感狮暑,默認(rèn)是fasle
  3. multiline:多行搜索,默認(rèn)值是false
  4. lastIndex:是當(dāng)前表達(dá)式匹配內(nèi)容的最后一個(gè)字符的下一個(gè)開(kāi)始搜索的位置
  5. source:正則表達(dá)式的文本字符串
var reg1 = /\w/;
var reg2 = /\w/gim; 
reg1.global //false
reg2.multiline //true


11. 正則表達(dá)式對(duì)象方法


11.1 RegExp.prototype.test(str)

用于測(cè)試字符串參數(shù)重是否存在匹配正則表達(dá)式模式的字符串辉饱,如果存在則返回true搬男,否則返回false
但此方法,會(huì)有以下bug

var reg1 = /\w/
var reg2 = /\w/g
reg1.test('a')//true

reg2.test('ab')//true
reg2.test('ab')//true
reg2.test('ab')//false
reg2.test('ab')//true
reg2.test('ab')//true
reg2.test('ab')//false

會(huì)有以上原因主要是因?yàn)閘astIndex此屬性
正則對(duì)象的test()執(zhí)行后彭沼,其自身的lastIndex屬性值+1缔逛,循環(huán)著
解決方法:

  1. 每次都實(shí)例化一個(gè) (/\w/g).test('ab'),然而每次實(shí)例化一個(gè)對(duì)象需要內(nèi)存開(kāi)銷的
  2. 使用exec方法
11.2 RegExp.prototype.exec(str)

用途:使用正則表達(dá)式模塊對(duì)字符串執(zhí)行搜索,并將更新全局RegExp對(duì)象的屬性以反映匹配結(jié)果

如果沒(méi)有匹配的文本則返回null褐奴,否則返回一個(gè)結(jié)果數(shù)組按脚,數(shù)組有兩個(gè)額外的屬性

  1. index:生命匹配文本的第一個(gè)字符的位置
  2. input:存放被檢索的字符串string

非全局調(diào)用(即沒(méi)有修飾符g)

  • 返回?cái)?shù)組
  • 第一個(gè)元素是與正則表示相匹配的文本
  • 第二個(gè)元素是與RegExpObject的第一個(gè)子表達(dá)式相匹配的文本(如果有的話)
  • 第三個(gè)元素是與RegExp對(duì)象的第二個(gè)子表達(dá)式相匹配的文本(如果有的話),以此類推
  • 子表達(dá)式就是分組的內(nèi)容
var ts = '1a2b3c4d5e'
var reg3 = /\d(\w)\d/
var ret = reg3.exec(ts)
console.log(reg3.lastIndex+' '+ret.index+' '+ret.toString())
//0 0 1a2,a
console.log(reg3.lastIndex+' '+ret.index+' '+ret.toString())
//0 0 1a2,a

對(duì)整個(gè)字符串進(jìn)行搜索,能獲得到具體的值:

var ts = '1a2b3c4d5e'
var reg4 = /\d(\w)\d/g, ret
while(ret = reg4.exec(ts)){
    console.log(reg4.lastIndex+' '+ret.index+' '+ret.toString())
}
//2 3 0 1a2,a
//2 7 4 3c4,c


12. 跟正則表達(dá)式非常相關(guān)的字符串對(duì)象方法


12.1 String.prototype.search(reg)

用途:檢索與正則表達(dá)式相匹配的子字符串

  • 方法返回第一個(gè)匹配結(jié)果的index敦冬,搜索不到返回-1
  • search()方法不執(zhí)行全局匹配辅搬,忽略標(biāo)志g,并且總是從字符串的開(kāi)始進(jìn)行
  • search參數(shù)不是正則的都會(huì)嘗試轉(zhuǎn)換成正則
'a1b2c3d1'.search('1')
//1
'a1b2c3d1'.search(/1/)
//1
'a1b2c3d1'.search(1)
//1
12.2 String.prototype.match(reg)

用途:match()檢索字符串脖旱,返回匹配的結(jié)果數(shù)組堪遂,沒(méi)有則null
有兩個(gè)對(duì)象屬性

  1. index:聲明匹配文本的起始字符在字符串的位置
  2. input:聲明對(duì)stringObject的引用
  • 若是非全局調(diào)用的話(無(wú)g),是和正則表達(dá)式方法的exec用途相反
  • 若是全局調(diào)用萌庆,match只是返回?cái)?shù)組溶褪,不會(huì)有index什么的
    例子:
String.prototype.split(reg)
'a,b,c,d'.split(',')
'a1b2c3d4e'.split(/\d/g)
// ["a", "b", "c", "d", "e"]
12.3 String.prototype.replace

三個(gè)用法:

  • String.prototype.replace(str, replaceStr)
  • String.prototype.replace(reg, replaceStr)
  • String.prototype.replace(reg, function(){})

上面的回調(diào)函數(shù)在每次匹配替換的時(shí)候調(diào)用,有四個(gè)參數(shù)

  1. 匹配字符串
  2. 正則表達(dá)式分組內(nèi)容践险,沒(méi)有分組則沒(méi)有該參數(shù)
  3. 匹配項(xiàng)在字符串中的index
  4. 原字符串
'a1b1c1'.replace('1',2)
//a2b1c1
'a1b1c1'.replace(/1/g,2)
//a2b2c2
// 需要實(shí)現(xiàn)的目標(biāo):'a1b2c3d4' => 'a2b3c4d5'
'a1b2c3d4'.replace(/\d/g,function(match, index, origin){
    console.log(index)
    return parseInt(match)+1
})
// 1
// 3
// 5
// 7
// "a2b3c4d5"

'a1b2c3d4'.replace(/(\d)(\w)(\d)/g,function(match, group1, group2,group3, index, origin){
    console.log(match)
    return group1+group3
})
//1b2
//3d4
//"a12c34"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猿妈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巍虫,更是在濱河造成了極大的恐慌彭则,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垫言,死亡現(xiàn)場(chǎng)離奇詭異贰剥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筷频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蚌成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凛捏,你說(shuō)我怎么就攤上這事担忧。” “怎么了坯癣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵瓶盛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我示罗,道長(zhǎng)惩猫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任蚜点,我火速辦了婚禮轧房,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绍绘。我一直安慰自己奶镶,他們只是感情好迟赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著厂镇,像睡著了一般纤壁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捺信,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天酌媒,我揣著相機(jī)與錄音,去河邊找鬼残黑。 笑死馍佑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梨水。 我是一名探鬼主播拭荤,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疫诽!你這毒婦竟也來(lái)了舅世?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奇徒,失蹤者是張志新(化名)和其女友劉穎雏亚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體摩钙,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罢低,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胖笛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片网持。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖长踊,靈堂內(nèi)的尸體忽然破棺而出功舀,到底是詐尸還是另有隱情,我是刑警寧澤身弊,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布辟汰,位于F島的核電站,受9級(jí)特大地震影響阱佛,放射性物質(zhì)發(fā)生泄漏帖汞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一凑术、第九天 我趴在偏房一處隱蔽的房頂上張望翩蘸。 院中可真熱鬧,春花似錦麦萤、人聲如沸鹿鳖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翅帜。三九已至,卻和暖如春命满,著一層夾襖步出監(jiān)牢的瞬間涝滴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工胶台, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼疮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓诈唬,卻偏偏與公主長(zhǎng)得像韩脏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铸磅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355