正則表達(dá)式小結(jié)

上個(gè)公司的項(xiàng)目是個(gè)視頻直播即時(shí)聊天的APP,聊天內(nèi)容有文字饥伊,并且文字分好幾個(gè)部分例如“某某人對某某人說:blabla......”這就已經(jīng)三個(gè)部分了(某某人象浑,某某人,說的內(nèi)容)琅豆,每個(gè)部分按照需求文字的顏色還要不一樣愉豺;除此之外,還有表情茫因,當(dāng)然服務(wù)端發(fā)過來的都是帶有標(biāo)識的文字蚪拦,比如一個(gè)微笑表情,服務(wù)端過來的是這樣的:[微笑]冻押,你沒有看錯(cuò)驰贷,是漢字,哎洛巢!不說了括袒。當(dāng)時(shí)作的時(shí)候用的正則表達(dá)式去摳字符串,現(xiàn)在記一下吧稿茉,我這人腦子里存不了東西锹锰。
??正則表達(dá)式我的理解就像央視的一個(gè)節(jié)目《墻來了》,被匹配的字符串就是那些搞怪的參賽者漓库,正則表達(dá)式就是墻上面的形狀輪廓恃慧,匹配的過程就是人擺出的形狀和墻上的輪廓是否契合。

精確匹配和字符轉(zhuǎn)義

就是匹配字符或字符串本身渺蒿,例如Hello痢士,就是要匹配Hello(好傻的表達(dá),知道這個(gè)意思就行)茂装。不過一些字符在正則表達(dá)式里有特別的含義怠蹂,匹配這些字符本身,就需要借助“\”轉(zhuǎn)義為普通字符少态,比如.在正則表達(dá)式中表示除換行符外的任意字符城侧。那要匹配.本身,就這樣了“\.”况增,That's it赞庶。

元字符

不廢話,看表格最清楚了:

元字符 匹配內(nèi)容
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線或漢字
\s 匹配任意的空白字符(空格、制表符歧强、換頁符澜薄、換行符、回車符等)
\d 匹配任意數(shù)字
\b 匹配單詞的開始或結(jié)束位置
^ 匹配行或字符串開始位置摊册、在字符類中取反
$ 匹配行或字符串結(jié)束位置

重復(fù)匹配

現(xiàn)在假如匹配5個(gè)a肤京,這么寫aaaaa有點(diǎn)不那么講究,這么寫a{5}就舒服多了茅特。當(dāng)然在重復(fù)匹配里也有像元字符一類表示特定重復(fù)匹配次數(shù)的字符忘分,看表就明白了:

重復(fù)匹配規(guī)則 說明
* 重復(fù)匹配零次或更多次
+ 重復(fù)匹配一次或更多次
? 重復(fù)匹配零次或者一次
{n} 重復(fù)匹配n次
{n,} 重復(fù)匹配n次或更多次
{n,m} 重復(fù)匹配n到m次

字符類

可以看出元字符定義了一個(gè)匹配范圍(字符或者位置)。通過字符類我們也可以定義一個(gè)匹配范圍白修,很簡單妒峦,快使用[]。比如我們現(xiàn)在匹配abcd這個(gè)范圍的字符串就可以這樣寫[abcd]兵睛。ok肯骇,那么現(xiàn)在定義大寫英文字母這個(gè)匹配范圍,該如何是好祖很?[A-Z]笛丙,That't it!不用解釋那個(gè)迷人的-假颇,你該知道ta的用處了胚鸯。來個(gè)例子定義js變量命名規(guī)范的正則^[a-zA-Z\_\$][a-zA-Z0-9\_\$]*

取反

還記得那個(gè)^嗎笨鸡?ta在字符類中還有別的含義姜钳,看個(gè)例子[^a-z]表示除了小寫英文字母外其它的字符,在字符類中^還表示取這個(gè)字符類相反的匹配范圍镜豹。字符類可以這樣取反傲须,元字符也有相對應(yīng)的元字符用于對該元字符取反(好厲害的表達(dá)水準(zhǔn))蓝牲,而且這樣的元字符是非常有規(guī)律的趟脂,看表找一下唄:

取反元字符 匹配說明
\W 匹配任意不是字母,數(shù)字例衍,下劃線昔期,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數(shù)字的字符
\B 匹配不是單詞開始或結(jié)束的位置

分支條件

這個(gè)名字也是看其他人的,不過管他呢》鹦現(xiàn)在有這樣一個(gè)需求:有a,b兩個(gè)匹配范圍硼一,通過組合就會(huì)有4種匹配范圍了(a,b梦抢,ab般贼,ba),如果一個(gè)字符串滿足這4種的任一種都算匹配成功。怎么搞哼蛆?快使用|蕊梧,這么寫:a|b|ab|ba。That's it蚌讼!

分組及后向引用

看到現(xiàn)在你大概也感覺到不管是元字符庞瘸,還是字符類塞琼,ta們(-:瞧瞧這中西合璧的語言風(fēng)格:-)都定義了一個(gè)字符匹配的范圍,別的情況還好甘改,但是當(dāng)重復(fù)匹配一組字符的時(shí)候就有困難了。例如重復(fù)匹配abc三次灭抑,不好弄了吧十艾,還是快使用()吧,(abc){3}腾节。就是這么簡單疟羹,就是這么酸爽。
??上面只是()的一個(gè)非常小的用法禀倔。下面看大招榄融,一個(gè)()就是一個(gè)組(匹配小括號字符除外啊)救湖,并分配有組號愧杯。默認(rèn)情況下,從左向右鞋既,以(為標(biāo)記力九,第一個(gè)(組號為1,然后依次類推邑闺。這個(gè)組號有啥用跌前,可以引用成功匹配組號對應(yīng)組定義的規(guī)則的字符串內(nèi)容,注意加重的文字陡舅,不是引用組號對應(yīng)組的匹配規(guī)則抵乓,而是成功匹配這個(gè)規(guī)則的字符串本身。怎么引用呢靶衍,使用\組號灾炭。
??別廢話,說例子吧颅眶!
??\b([a-zA-Z]+)\b\s+\1\b蜈出,這個(gè)正則分三部分:\b([a-zA-Z]+)\b\s涛酗、\1\b≌≡現(xiàn)在有Mookaka匹配第一部分偷厦,然后一個(gè)空白符Mookaka,之后\1就引用第一部分那個(gè)分組匹配成功的字符串也就是Mookaka燕刻,所以整個(gè)正則可以匹配像Mookaka Mookaka這樣的字符串沪哺。
??當(dāng)然像1,2這樣的組號看不出所表達(dá)的意義酌儒,我們也可以自己指定組號辜妓,像這樣(?<你的組號>匹配規(guī)則)或者(?\你的組號`匹配規(guī)則)。當(dāng)然有時(shí)你不需要什么這個(gè)分組啊忌怎,引用什么的籍滴,就只是想單純的重復(fù)匹配一組字符串,可以這樣寫**(?:匹配規(guī)則)`**榴啸,這樣只匹配規(guī)則孽惰,不分配組號,也不捕獲成功匹配的字符串內(nèi)容鸥印。

零寬斷言

不糾結(jié)這個(gè)名字勋功,知道這個(gè)名詞指的是什么就行。先舉一個(gè)例子库说,大家都知道QQ郵箱的格式一般前面是10位數(shù)字狂鞋,然后是@qq.com,現(xiàn)在我們有一批郵箱地址潜的,想從這些地址中摳出qq號骚揍,我們只要qq號,后面什么@qq.com就不要了啰挪,于是你寫了一個(gè)真正\d{10,11}@qq\.com信不,之后你獲得的是完整的郵箱地址,接下來你會(huì)在構(gòu)建一個(gè)正則什么的來取這個(gè)地址字符串前面的qq號亡呵。能不能定義這樣一種正則抽活,要取的字符串本身匹配定義的正則,并且以這個(gè)字符串為基點(diǎn)ta的前面或后面也匹配定義的其它正則锰什,零寬斷言就是干這事的下硕。例如上面的例子,構(gòu)建正則\d{10,11}(?=@qq\.com)歇由,那么這個(gè)正則就直接取前面的qq號卵牍。
??零寬斷言就是定義要獲取的匹配正則的字符串位置的前面或后面需要符合的規(guī)則果港,但符合這個(gè)規(guī)則的字符串不在取出字符串之列沦泌,看表格(這里把那個(gè)要獲取的字符串稱為基點(diǎn)字符串吧):

表達(dá)式 說明
(?=RegExp) 基點(diǎn)字符串后跟符合RegExp定義的內(nèi)容
(?<=RegExp) 基點(diǎn)字符串前面跟符合REgExp定義的內(nèi)容
(?!RegExp) 基點(diǎn)字符串后面不跟符合RegExp定義的內(nèi)容
(?<!RegExp) 基點(diǎn)字符串前面不跟符合RegExp定義的內(nèi)容

貪婪、懶惰匹配

一般情況下辛掠,正則表達(dá)式里含有重復(fù)谢谦,那么在使整個(gè)正則表達(dá)式能夠匹配的前提下释牺,重復(fù)將會(huì)匹配盡可能多的字符』赝欤看這樣一個(gè)正則^(\d+)(0*)$没咙,注意這里有兩個(gè)分組,如果102300和ta匹配千劈,第一個(gè)組獲取102300祭刚,第二個(gè)組什么也捕獲不了,但實(shí)際上我們希望組一獲取1023墙牌,組二捕獲剩下的零的涡驮。為了不讓正則在有重復(fù)匹配時(shí)太過貪心,在可能發(fā)生貪婪匹配的后面加個(gè)?喜滨,That's is捉捅。看表格:

懶惰匹配 說明
*? 重復(fù)匹配任意次虽风,但盡可能少重復(fù)
+? 重復(fù)1次或更多次棒口,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n次到m次辜膝,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上无牵,但盡可能少重復(fù)

注釋

還可以給正則加注釋,開發(fā)APP的時(shí)候用了很多正則表達(dá)式厂抖,有的還很長有點(diǎn)復(fù)雜合敦,開發(fā)組老大看著頭暈,提示正則可以加注釋验游。但是實(shí)際上也沒好多上充岛,反而正則更長看著更難受。用(?#你的注釋)的方式來加注釋耕蝉,看個(gè)例子:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)崔梗。

平衡組

假如現(xiàn)在我要從一個(gè)字符串中提取數(shù)學(xué)表達(dá)式,那么提取的字符串中如果有括號垒在,左括號和右括號的數(shù)量是一樣的蒜魄。先看一下下面的規(guī)則:

  • (?'group'RegExp) 把匹配RegExp規(guī)則的內(nèi)容命名為 group,并壓入棧中场躯。
  • (?'-group'RegExp) 假如匹配RegEXp規(guī)則谈为,把最后壓入棧且名為group的捕獲內(nèi)容彈出,如果棧是空的踢关,則這個(gè)分組的匹配失敗伞鲫。
  • (?(group)RegExp1|RegExp2) 假如棧上有名為group的捕獲內(nèi)容,就接著匹配RegExp1表達(dá)式签舞,否則繼續(xù)匹配RegExp2表達(dá)式秕脓。
  • (?!) 總是匹配失敗柒瓣。
    ??總是匹配失敗,搞什么吠架?
    ??匹配失敗時(shí)芙贫,正則表達(dá)式引擎會(huì)進(jìn)行回溯也就是放棄最前面或最后面的已經(jīng)捕獲了的字符,使整個(gè)表達(dá)式得到匹配傍药。
    ??這樣用(?'bracket' \()磺平,遇到左括號就在棧里面記一下,遇到右括號拐辽,就用(?'-bracket'\))褪秀,把對應(yīng)的左括號在棧中的記錄去掉;如果左括號比右括號多那么最后棧中一定還有記錄薛训,那么用(?(bracket)(?!))故意匹配失敗媒吗,讓正則表達(dá)式引擎去掉結(jié)果字符串中在棧里有記錄的字符串。這樣左右括號的數(shù)量就平衡了乙埃。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闸英,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子介袜,更是在濱河造成了極大的恐慌甫何,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遇伞,死亡現(xiàn)場離奇詭異辙喂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸠珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門巍耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渐排,你說我怎么就攤上這事炬太。” “怎么了驯耻?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵亲族,是天一觀的道長。 經(jīng)常有香客問我可缚,道長霎迫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任帘靡,我火速辦了婚禮知给,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘测柠。我一直安慰自己炼鞠,他們只是感情好缘滥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布轰胁。 她就那樣靜靜地躺著谒主,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赃阀。 梳的紋絲不亂的頭發(fā)上霎肯,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音榛斯,去河邊找鬼观游。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驮俗,可吹牛的內(nèi)容都是我干的懂缕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼王凑,長吁一口氣:“原來是場噩夢啊……” “哼搪柑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起索烹,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤工碾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后百姓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渊额,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年垒拢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旬迹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡求类,死狀恐怖舱权,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仑嗅,我是刑警寧澤宴倍,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站仓技,受9級特大地震影響鸵贬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脖捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一阔逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧地沮,春花似錦嗜浮、人聲如沸羡亩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畏铆。三九已至,卻和暖如春吉殃,著一層夾襖步出監(jiān)牢的瞬間辞居,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工蛋勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓦灶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓抱完,卻偏偏與公主長得像贼陶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子巧娱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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

  • 推薦幾個(gè)正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1閱讀 11,493評論 9 151
  • 幾個(gè)正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
  • 正則表達(dá)式到底是什么東西碉怔?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位,可能是字母家卖,數(shù)字眨层,標(biāo)點(diǎn)符號,空格上荡,換行符趴樱,漢字等...
    獅子挽歌閱讀 2,147評論 0 9
  • 初衷:看了很多視頻、文章酪捡,最后卻通通忘記了叁征,別人的知識依舊是別人的,自己卻什么都沒獲得逛薇。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,009評論 0 20
  • 學(xué)員聚會(huì)捺疼,酒過三巡,讓大家介紹下自己永罚,簡單的講下過往的人生經(jīng)歷啤呼。 被稱為老大哥的人說,年輕時(shí)呢袱,因?yàn)橐淮问д`官扣,跟愛好...
    自由的申申閱讀 291評論 0 1