javaScript的正則表達(dá)式詳解

正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern)憔鬼,可以用來(lái)檢查一個(gè)串是否含有某種子串仙逻、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等横腿。使用好正則表達(dá)式可以節(jié)省大量的代碼费就。

先從簡(jiǎn)單的案例體驗(yàn)下正則

/abc/.test("51abcd23");//true
/\d\d\d/.test("12ab");//false
/\d\d\d/.test("123ab");//true

new RegExp("Frankin").test("hello,Frankin");//true

以上定義了兩種正則調(diào)用的方法,當(dāng)校驗(yàn)規(guī)則是字符串的時(shí)候很好理解茬腿,就是被校驗(yàn)的字符串里是否含有校驗(yàn)規(guī)則的字符串歪赢,如果包含的話返回true,反之校驗(yàn)失敗返回false,并且大小寫(xiě)敏感单料,而\d這種特殊的語(yǔ)句規(guī)則又是什么呢埋凯?\d其實(shí)代表匹配0-9的數(shù)字,而這種匹配規(guī)則還有很多,我們可以看下圖扫尖。

常用元字符串:

語(yǔ)法 描述 例子
. 任意字符(除換行符外:\n,\r,\u2028 or \u2029) /.../.test('1a@');
\d 數(shù)字0-9 /\d\d\d/.test('123');
\D 非\d,即不是數(shù)字0-9的字符 /\D\D\D/.test('ab!');
\w 數(shù)字0-9或者字母a-z及A-Z(大小寫(xiě)),或下劃線 /\w\w\w\w/.test('aB9_');
\W 非\w /\w\w\w/.test('@!#');
\s 空格符白对、TAB、換頁(yè)符换怖、換行符 /\sabc/.test(' abc');
\S 非\s
\t \r \n \v \f tab 回車 換行 垂直制表符 換頁(yè)符

范圍符號(hào):

語(yǔ)法 描述 例子
[...] 字符范圍 [a-z] [0-9] [A-Z0-9a-z_]
[^...] 字符范圍以外 [^a-z] [^abc]
^ 行首 ^Hi
$ 行尾 test$
\b 零寬單詞邊界 \bno
\B 非\b

這里可能\b 零寬單詞邊界比較難理解甩恼,這里重點(diǎn)解釋下

當(dāng)我們需要把一句 This is a test這句話的is 替換成 IS時(shí),如果直接匹配is,會(huì)把This后面的is也給替換掉条摸,這時(shí)使用單詞邊界\bis\b來(lái)匹配悦污,便可以只匹配is而不匹配This了

當(dāng)我們剛好要匹配^或者$這些帶有范圍符號(hào)規(guī)則的字符時(shí),該怎么辦呢?

這時(shí)就需要用轉(zhuǎn)義字符\來(lái)聲明 不做別的范圍匹配作用 例如^

/\^abc/.test('^abc');//true

分組:

語(yǔ)法 描述 例子
(x) 分組钉蒲,并記錄匹配到的字符串 /(abc)/
\n 表示使用分組符(x)匹配到的字符串 /(abc)\1/.test('abcabc');
(?:x) 僅分組 /(?:abc)(def)\1/.test('abcdefdef');

這里講解下(x)和(?:x)的區(qū)別

當(dāng)使用(x)分組時(shí)切端,使用\n重新匹配第n個(gè)分組

當(dāng)只想將復(fù)雜的表達(dá)式分組,而不記錄被/n調(diào)用時(shí)顷啼,使用(?:x)便不會(huì)記錄匹配到的字符串

/(abc)(def)\1/.test('abcdefabc');//true
/(?:abc)(def)\1/.test('abcdefabc');//false
/(?:abc)(def)\1/.test('abcdefabc');//true

'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1');
//"11/25/2016"

重復(fù):

語(yǔ)法 描述 例子
x* x+ 重復(fù)次數(shù)>=0 重復(fù)次數(shù)>0 貪婪算法 正則表達(dá)式: abc*將匹配ab踏枣、abc、abcccccc<br />正則表達(dá)式:abc+將匹配abc钙蒙、abccccc茵瀑、卻匹配<u>ab</u>
x*? x+? 同x*,x+,非貪婪算法 正則表達(dá)式: abc*?在字符串a(chǎn)bcccccc將匹配ab<br />正則表達(dá)式:abc+?將匹配abc
x? 出現(xiàn)0或1次
x|y x或者y x|y匹配x,也匹配y<br />再比如:ab|cd|ef匹配ab或cd或e f
x{n} x{n,} x{n,m} 重復(fù)n次,重復(fù)>=n次,重復(fù)次數(shù)x滿足:n<=x<=m x{5}匹配xxxxxoo,不匹配xxo<br />x{1,3}匹配x,xx,xxx

前瞻

前瞻就是在正則表達(dá)式匹配到規(guī)則的時(shí)候躬厌,向前檢查是否符合斷言

js不支持后顧

名稱 正則 含義
正向前瞻 exp(?=assert)
負(fù)向前瞻 exp(?!assert)
正向后顧 exp(?<=assert) javaScript不支持
負(fù)向后顧 exp(?<!assert) javaScript不支持
'a2*3'.replace(/\w(?=\d)/g,'X');
//"X2*3"
'a2*34v8'.replace(/\w(?=\d)/g,'X');
//"X2*X4X8"
'a2*34vv'.replace(/\w(?=\d)/g,'X');
//"X2*X4vv"
'a2*34vv'.replace(/\w(?!\d)/g,'X');
//"aX*3XXX"

Flag马昨、RegExp對(duì)象屬性

  • global--g (全文匹配)
  • IgnoreCase--i (忽略大小寫(xiě))
  • Multiline--m. (多行搜索)
  • source (正則表達(dá)式的文本字符串)
  • lastIndex (是當(dāng)前表達(dá)式匹配內(nèi)容的最后一個(gè)字符的下一個(gè)位置)
var reg = /\bis\b/;
//或
var reg = new RegExp('\\bis\\b');

'He is a boy.This is a dog'.replace(reg,'IS')

//"He IS a boy.This is a dog"

//添加g 全文匹配,否則匹配到第一個(gè)后停止
var reg = /\bis\b/g;
//或
var reg = new RegExp('\\bis\\b',g);
'He is a boy.This is a dog'.replace(reg,'IS')
//"He IS a boy.This IS a dog"

//IgnoreCase用法
'This Is a dog'.replace(/is/g,'Q')
//"ThQ Is a dog"
'This Is a dog'.replace(/is/gi,'Q')
//"ThQ Q a dog"


//Multiline用法
const mulStr = "@123
                                @456
                                @789"
mulStr.replace(/^@\d/g,'X');
//  "X23
//  @456
//  @789"
mulStr.replace(/^@\d/gm,'X');
//  "X23
//  X456
//  X789"

RegExp對(duì)象方法

  • compile
  • exec
  • test
  • toString
/abc/.exec("abcdef"); // "abc" 此方法返回匹配到的字符串,類似字符串的match方法
/abc/.test("abcde"); //true   此方法返回boolean值
/abc/.toString();// "/abc/"
var reg = /abc/; 
reg.compile("def"); //compile修改正則的屬性
reg.test("def");//true

string類型與正則相關(guān)的方法

  • String.prototype.search 檢索正則規(guī)則匹配的字符串所在的索引
  • String.prototype.replace 替換正則匹配的值
  • String.prototype.match 返回一個(gè)數(shù)組烤咧,匹配正則規(guī)則的值組成的數(shù)組
  • String.prototype.split 字符串根據(jù)正則分割
"abcabcdef".search(/(abc)/1/);//0
"aabbbbcc".replace(/b+?/,1); //aa1bbbcc
"aabbbbcc".match(/b+/);//["bbbb"]
"aabbbbccbbaa".match(/b+/g);//["bbbb","bb"]
"aabbbbccbbaa".split(/b+/);//["aa","cc","aa"]

正則可視化工具

https://regexper.com

該站點(diǎn)有可能會(huì)被墻偏陪,為了穩(wěn)定的訪問(wèn),我們也可以在github下clone煮嫌,進(jìn)行本地部署

https://github.com/javallone/regexper-static

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笛谦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昌阿,更是在濱河造成了極大的恐慌饥脑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懦冰,死亡現(xiàn)場(chǎng)離奇詭異灶轰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)刷钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)笋颤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人内地,你說(shuō)我怎么就攤上這事伴澄。” “怎么了阱缓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵非凌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荆针,道長(zhǎng)敞嗡,這世上最難降的妖魔是什么颁糟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喉悴,結(jié)果婚禮上棱貌,老公的妹妹穿的比我還像新娘。我一直安慰自己粥惧,他們只是感情好键畴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著突雪,像睡著了一般起惕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咏删,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天惹想,我揣著相機(jī)與錄音,去河邊找鬼督函。 笑死嘀粱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辰狡。 我是一名探鬼主播锋叨,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宛篇!你這毒婦竟也來(lái)了娃磺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叫倍,失蹤者是張志新(化名)和其女友劉穎偷卧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吆倦,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡听诸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕泽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌梨。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖须妻,靈堂內(nèi)的尸體忽然破棺而出派任,到底是詐尸還是另有隱情,我是刑警寧澤璧南,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站师逸,受9級(jí)特大地震影響司倚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一动知、第九天 我趴在偏房一處隱蔽的房頂上張望皿伺。 院中可真熱鬧,春花似錦盒粮、人聲如沸鸵鸥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妒穴。三九已至,卻和暖如春摊崭,著一層夾襖步出監(jiān)牢的瞬間讼油,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工呢簸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矮台,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓根时,卻偏偏與公主長(zhǎng)得像瘦赫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛤迎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 正則表達(dá)式到底是什么東西确虱?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位,可能是字母忘苛,數(shù)字蝉娜,標(biāo)點(diǎn)符號(hào),空格扎唾,換行符召川,漢字等...
    獅子挽歌閱讀 2,136評(píng)論 0 9
  • 1,正則表達(dá)式的作用:匹配一個(gè)字符串中的一些內(nèi)容 2胸遇,聲明和使用: 1)構(gòu)造函數(shù) var reg=new RegE...
    WDL_1a39閱讀 721評(píng)論 0 1
  • 注:本篇文章只為方便查看荧呐,特此保留,如有冒犯纸镊,敬請(qǐng)諒解1恫!逗威! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么峰搪,并對(duì)它...
    阿杰Alex閱讀 1,478評(píng)論 0 10
  • 9.19--9.23 第7章 正則表達(dá)式 正則表達(dá)式是一個(gè)拆分字符串并查詢相關(guān)信息的過(guò)程。 推薦練習(xí)網(wǎng)站: js ...
    如201608閱讀 1,015評(píng)論 0 4
  • 1.12個(gè)常用的js正則表達(dá)式 (1)在input框中只能輸入金額凯旭,其實(shí)就是只能輸入最多有兩位小數(shù)的數(shù)字** (2...
    Bai1997_閱讀 554評(píng)論 0 0