正則表達式詳解

注意:

  • 匹配了的項不會再匹配了
  • 空格也參與匹配
  • 如果加了^和$則是匹配字符串從而得出true or false(對給定的字符串只匹配一次)
  1. 什么是正則表達式

    正則表達式是由一個字符序列形成的搜索模式腕巡。

    當(dāng)你在文本中搜索數(shù)據(jù)時,你可以用搜索模式來描述你要查詢的內(nèi)容。

    正則表達式可以是一個簡單的字符,或一個更復(fù)雜的模式。

    正則表達式可用于所有文本搜索(search方法)和文本替換(replace方法)的操作。

    語法

    / 正則表達式主體 / 修飾符(可選)

    修飾符:

    i 不區(qū)分(ignore)大小寫
    例如: /abc/i 可以匹配 abc、aBC蜈亩、Abc


    g 全局(global)匹配
    如果不帶g,正則過程中字符串從左到右匹配前翎,找到第一個符合條件的即匹配成功稚配,返回
    如果帶g,則字符串從左到右港华,找到每個符合條件的都記錄下來道川,直到字符串結(jié)尾位置
    例如:
    var str = 'aaaaaaaa'
    var reg1 = /a/; str.match(reg1) // 結(jié)果為:["a", index: 0, input: "aaaaaaaa"]
    var reg2 = /a/g; str.match(reg2) // 結(jié)果為:["a", "a", "a", "a", "a", "a", "a", "a"]


    m 多(more)行匹配
    若存在換行\(zhòng)n并且有開始^或結(jié)束 (美元符) 符的情況下,和 g一起使用實現(xiàn)全局匹配,
    因為存在換行時默認(rèn)會把換行符作為一個字符任務(wù)匹配字符串是個單行,
    g只匹配第一行愤惰,添加m之后實現(xiàn)多行苇经,每個換行符之后就是開始
    var str = "abcggab\nabcoab";
    var preg1 = /^abc/gm; str.match(preg1) // 結(jié)果為:["abc", "abc"]
    var preg2 = /ab$/gm; str.match(preg2) // 結(jié)果為:["ab", "ab"]


    s 特殊字符圓點 . 中包含換行符
    默認(rèn)的圓點 . 是 匹配除換行符 \n 之外的任何單字符,加上s之后, . 中包含換行符
    $ str = "abggab\nacbs";
    $ preg = "/b./s";
    preg_match_all($preg, $str,$matchs);
    print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )


    U 只匹配最近的一個字符串;不重復(fù)匹配;
    $mode="/a(.*?)c/";
    $preg="/a.*c/U";//這兩個正則返回相同的值
    $str="abcabbbcabbbbbc" ;
    preg_match($mode,$str,$content); echo $content[0];//abc
    preg_match($preg,$str,$content); echo $content[0];//abc
    //修正符:x 將模式中的空白忽略;
    //修正符:A 強制從目標(biāo)字符串開頭匹配;
    //修正符:D 如果使用$限制結(jié)尾字符,則不允許結(jié)尾有換行;
    //修正符:e 配合函數(shù)preg_replace()使用, 可以把匹配來的字符串當(dāng)作正則表達式執(zhí)行;

注意:上面主要使用search()方法和replace()方法宦言,也能用test()方法

search() 方法
用于檢索字符串中指定的子字符串扇单,或檢索與正則表達式相匹配的子字符串,并返回子串的起始位置奠旺。
var str = "Visit Runoob!";
var n = str.search("Runoob");

replace() 方法
用于在字符串中用一些字符替換另一些字符蜘澜,或替換一個與正則表達式匹配的子串。
str='Visit Microsoft'
str.replace(/microsoft/i,'Runoob') //使用Runoob 代替 str 中的Microsoft字符串</pre>


注意:下面的寫法 被稱為 正則表達式模式

使用方法有兩個:

  1. test()

    test() 方法用于檢測一個字符串是否匹配某個模式响疚,如果字符串中含有匹配的文本鄙信,則返回 true,否則返回 false忿晕。

    const pat1=new RegExp('e') //是否有字母e

    pat1.test('the best thing') //true

  2. exec()

    exec() 方法用于檢索字符串中的正則表達式的匹配装诡。

    該函數(shù)返回一個數(shù)組,其中存放匹配的結(jié)果践盼。如果未找到匹配鸦采,則返回值為 null。

    const pat1=new RegExp('e') //是否有字母e

    pat1.exec('the best thing') //返回了 要找的內(nèi)容 e

  3. 正則表達式的元字符

圖片1.png

注意: ^ 在 [ ] 中是取反的意思咕幻,在外面是匹配字符串的開始的意思

^.{2}$ 表示匹配兩個除了\以外字符組成的字符串

[^aeiou] 表示除了aeiou以外的字符

  1. 反義(將小寫變成大寫即可)

圖片2.png

[ aeiou] ID 表示 可以是[ ]中的任意一個再加上 ID 組成的字符

3.轉(zhuǎn)義

問題: 如何匹配特殊字符呢 渔伯? 如 ‘ . ’ ,' ? '等

答:使用轉(zhuǎn)義符 【 \ 】,如 \ . , \ ?

  1. 正則表達式的注釋

圖片3.png

5.正則表達式的重復(fù)

圖片4.png

例如:

?表示 有沒有肄程,+ 表示要不要在加幾個 锣吼,* 表示任意個,沒有限制

zo* 表示可以匹配 z 或者 zoo

\ d{8} 表示 匹配 8位的數(shù)字

6.分支條件

圖片5.png

例子

如 ^ 0\d{2,3}-\d{8} | 0\d{3}-d{7} $

021-1234567 true

023-12345678 true

023-123456789 false,后半段數(shù)字的長度只能是7或者8位蓝厌,其中 …^ 表示開始玄叠, $表示結(jié)尾

\d{2,6} 表示2到6位數(shù)字

7.分組:()

作用:將子表達式做成子集,方便對匹配的字符進行劃分

符號 :()

例子:

(\d{1,3} \ .){3}\d{1,3} 匹配IP地址

其中 \d {1,3} 表示 可以是 1-3個數(shù)字

圖片6.png

8.貪婪和懶惰

  • 貪婪 : .*

    作用: 比如 <a.*> ,如果一個頁面中有多個< a>標(biāo)簽褂始,則會將第一個< a > 一直到最后一個< a> 看成是一個結(jié)果找出

    理解:

    ' . ' 代表 匹配除了 換行符 以外的所有字符

    ‘ * ’ 代表 出現(xiàn)次數(shù)為 零次到無限次

    ‘ .* ' 表示 除了換行符的字符 出現(xiàn)零次到無限次

  • 懶惰 :.*?

    作用:比如 < a .*>,如果一個頁面中有多個 < a > 標(biāo)簽诸典,則會將每一個 < a>標(biāo)簽看成一個結(jié)果描函,如果有n個 崎苗,則會有n個結(jié)果

    理解:

    ’ ?' 代表 出現(xiàn)零次或者一次(盡量匹配少的內(nèi)容舀寓,最簡短的那個)


    例子:

    當(dāng)正則表達式中包含能接受重復(fù)的限定符時胆数,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b互墓,它將會匹配最長的以a開始必尼,以b結(jié)束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串a(chǎn)abab判莉。這被稱為貪婪匹配豆挽。

    有時,我們更需要懶惰匹配券盅,也就是匹配盡可能少的字符帮哈。前面給出的限定符都可以被轉(zhuǎn)化為懶惰匹配模式,只要在它后面加上一個問號?锰镀。這樣.*?就意味著匹配任意數(shù)量的重復(fù)娘侍,但是在能使整個匹配成功的前提下使用最少的重復(fù)。現(xiàn)在看看懶惰版的例子吧:

    a.*?b匹配最短的泳炉,以a開始憾筏,以b結(jié)束的字符串。如果把它應(yīng)用于aabab的話花鹅,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)

圖片7.png
圖片8.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氧腰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刨肃,更是在濱河造成了極大的恐慌容贝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件之景,死亡現(xiàn)場離奇詭異斤富,居然都是意外死亡,警方通過查閱死者的電腦和手機锻狗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門满力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轻纪,你說我怎么就攤上這事油额。” “怎么了刻帚?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵潦嘶,是天一觀的道長。 經(jīng)常有香客問我崇众,道長掂僵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任顷歌,我火速辦了婚禮锰蓬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眯漩。我一直安慰自己芹扭,他們只是感情好麻顶,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舱卡,像睡著了一般辅肾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轮锥,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天宛瞄,我揣著相機與錄音,去河邊找鬼交胚。 笑死份汗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝴簇。 我是一名探鬼主播杯活,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熬词!你這毒婦竟也來了旁钧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤互拾,失蹤者是張志新(化名)和其女友劉穎歪今,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颜矿,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡寄猩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骑疆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片田篇。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖箍铭,靈堂內(nèi)的尸體忽然破棺而出泊柬,到底是詐尸還是另有隱情,我是刑警寧澤诈火,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布兽赁,位于F島的核電站,受9級特大地震影響冷守,放射性物質(zhì)發(fā)生泄漏刀崖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一教沾、第九天 我趴在偏房一處隱蔽的房頂上張望蒲跨。 院中可真熱鬧译断,春花似錦授翻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巡语。三九已至,卻和暖如春淮菠,著一層夾襖步出監(jiān)牢的瞬間男公,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工合陵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枢赔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓拥知,卻偏偏與公主長得像踏拜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子低剔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 概述 正則表達式是一種描述字符串結(jié)果的語法規(guī)則速梗,是一個特定的格式化模式,可以匹配襟齿、替換姻锁、截取匹配的字符串。常用的語...
    醉于麥田閱讀 496評論 0 0
  • 正則表達式是一種描述字符串結(jié)果的語法規(guī)則猜欺,是一個特定的格式化模式位隶,可以匹配、替換开皿、截取匹配的字符串钓试。常用的語言基本...
    極客小寨閱讀 339評論 0 0
  • 因為比較重要,所以還是單獨拿出來作一篇文章副瀑,好好學(xué)習(xí)一下弓熏。 正則表達式:Regular expression 定義...
    齊舞647閱讀 1,002評論 3 7
  • #首先,python中的正則表達式大致分為以下幾部分: 元字符 模式 函數(shù) re 內(nèi)置對象用法 分組用法 環(huán)視用法...
    mapuboy閱讀 1,610評論 0 51
  • JavaScript-正則表達式 記錄這篇高大上的正則表達式糠睡,其實接觸很多挽鞠,但是實際項目里面感覺運用的比較少呀,用...
    明明三省閱讀 3,039評論 0 24