老司機(jī)出品——包教包會(huì)之玩轉(zhuǎn)正則表達(dá)式

玩轉(zhuǎn)正則表達(dá)式

2017年2月16日14時(shí)11分更新Level3詳解

結(jié)束了CoreAnimation系列之后,老司機(jī)心里仿佛也輕松了許多。今天說說開發(fā)中的一個(gè)利器吧继找,正則表達(dá)式

首先說正則表達(dá)式是什么逃沿?

正則表達(dá)式婴渡,又稱規(guī)則表達(dá)式。(英語:Regular Expression凯亮,在代 碼中常簡寫為regex边臼、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念假消。正則表通常被用來檢索柠并、替換那些符合某個(gè)模式(規(guī)則)的文本。

其實(shí)借助正則表達(dá)式富拗,我們可以對字符串進(jìn)行很多操作臼予,最大的優(yōu)勢就是從字符串中獲取字符串以及判斷字符串是否符合條件。

然而事實(shí)上有很多程序員都抱怨啃沪,正則表達(dá)式的語法晦澀難懂瘟栖,的確,一個(gè)個(gè)符號(hào)看似毫無規(guī)律的拼湊在一起讓人看起來確實(shí)頭疼谅阿。

幸運(yùn)的是,老司機(jī)曾經(jīng)拿出兩個(gè)下午來認(rèn)真的研究了一下正則表達(dá)式酬滤,所以老司機(jī)也是目前我們組唯一一個(gè)手?jǐn)]正則表達(dá)式的騷年签餐,so,讓老司機(jī)沾沾自喜一下可好~

沾沾自喜

當(dāng)然盯串,嘚瑟完還是要來干貨的氯檐,那老司機(jī)用老司機(jī)的方式帶你看一下正則。


元字符

讓我們先啃一下硬骨頭体捏,元字符冠摄。

所謂元字符糯崎,就是幾個(gè)特定的符號(hào)組合在一起,其代表的含義已經(jīng)不是原先符號(hào)本身的含義河泳,而更像是一個(gè)表達(dá)式沃呢。

正則表達(dá)式正是因?yàn)樵址兊幕逎舱且驗(yàn)樵址兊暮啙崱?/p>

元字符1
元字符2
元字符3

以上圖片截自百度百科正則表達(dá)式


Level1

元字符之多拆挥,多到讓人記不住薄霜,不過老司機(jī)之前說過,元字符不過是帶有特定含義的表達(dá)式用來讓表達(dá)式簡潔纸兔,所以你不用表達(dá)式惰瓜,用最基本的字符完全可以組成表達(dá)式,比如下面這種情況:

  • [0123456789] 你可以用這個(gè)表達(dá)式來代表一個(gè)數(shù)字元素
  • [0-9] 你同樣可以用這個(gè)表達(dá)式代表一個(gè)數(shù)字元素
  • \d 你更可以用這個(gè)表達(dá)式代表一個(gè)數(shù)字元素

從上至下汉矿,表達(dá)式形式越來越簡單崎坊,不過其書寫形式卻越來越難懂。
所以即使你記不住\d,你也可以用[0123456789]來替代洲拇,當(dāng)你熟練了奈揍,自然也就記住\d了對不對。

所以說呻待,并不是所有元字符你都需要記住的打月,不過老司機(jī)挑了這么幾個(gè)出來,是能大幅度提高你書寫速度的幾個(gè)元字符:

  • [] 對于他蚕捉,我的命名是元素枚舉表達(dá)式奏篙,表示中括號(hào)之間的任意一個(gè)元素均可以當(dāng)做作為一個(gè)元素存在。
  • {n,m} 這個(gè)迫淹,我姑且稱他為范圍表達(dá)式秘通。他的含義是表示他前面的元素有x個(gè),x介于[n,m]之間的閉區(qū)間(即包含n,m)敛熬。

eg. 結(jié)合上面兩個(gè)表達(dá)式肺稀,我們可以這樣寫一個(gè)表達(dá)式:[0123456789]{1,2},其含義是一個(gè)1到2位的純數(shù)字应民。當(dāng)然\d{1,2}會(huì)讓你的表達(dá)式看起來更加簡潔话原。

  • () 括號(hào)表達(dá)式,他的含義僅僅是將括號(hào)間的所有表達(dá)式作為一個(gè)整體看做新的元素诲锹。

eg. 到這里你可以寫這樣一個(gè)表達(dá)式:
([a-z]{1,2}[\d]{1,2}){1,2}繁仁,恩,是不是已經(jīng)亂七八糟了归园,我們一點(diǎn)一點(diǎn)拆解黄虱,[a-z]{1,2}表示1或2個(gè)小寫字母[\d]{1,2}表示1或2個(gè)數(shù)字庸诱,兩個(gè)表達(dá)式連一起就是1或2個(gè)小寫字母后面緊跟1或2個(gè)數(shù)字(例如ab12)捻浦,然后[a-z]{1,2}[\d]{1,2}被擴(kuò)在小括號(hào)表達(dá)式中晤揣,他們已經(jīng)作為一個(gè)整體被視為一個(gè)元素,這樣的元素又有1或2個(gè)朱灿,所以符合這個(gè)表達(dá)式的字符串可能是這個(gè)樣子的:a12bc1

所以說這么一個(gè)難看的表達(dá)式一點(diǎn)一點(diǎn)拆解我們也是能看懂的是吧

  • . 點(diǎn)表達(dá)式昧识,標(biāo)識(shí)除“\r\n”之外的任何單個(gè)字符

  • | 或表達(dá)式,表示 | 前后的兩個(gè)元素中任意一種情況

到了這里母剥,你已經(jīng)可以寫出任意一個(gè)表達(dá)式了滞诺,這些就夠了。

比如說既包含字母又包含數(shù)字的字符串:

\d{0,}([a-z]{1,}\d{1,}){1,}[a-z]{0,}

這是一個(gè)比較丑的表達(dá)式环疼,不過他真的能匹配所有情況习霹,你可以慢慢想一下(別太仔細(xì)想,雖然可以這么用不過太單純了炫隶,沒人這么用的)淋叶。

如果說你不介意,到這里伪阶,你已經(jīng)學(xué)夠了煞檩,我似乎看到了你滿足的表情。

滿足了

Level2

你的手沒有因?yàn)榭吹缴厦婺菑垐D而離開鼠標(biāo)??栅贴,而是繼續(xù)看到這說明你已經(jīng)不是隨隨便便就能春心蕩漾的小朋友了斟湃,那么現(xiàn)在請你系好安全帶,要發(fā)車了檐薯!

要發(fā)車了凝赛!

所以說單純一個(gè)同時(shí)包含數(shù)字字母就要這么臭又長的表達(dá)式的話,正則表達(dá)式也就真沒有存在的意義了坛缕。這種有先決條件的表達(dá)式我們要怎么處理呢墓猎?
是否能先處理先決條件再進(jìn)行匹配呢?

答案當(dāng)然是肯定的赚楚,你要了解預(yù)查模式毙沾。

所謂預(yù)查模式就是首先檢查整個(gè)元素是否滿足條件,滿足后再進(jìn)行逐一匹配宠页。

預(yù)查有下面幾種形式:(下列pattern均代表表達(dá)式)

  • (?=pattern) 正向肯定預(yù)查
  • (?!pattern) 正向否定預(yù)查

所謂正向就是固定字符串在前左胞,條件字符串在后【倩В肯定就是包含條件中的字符串烤宙,否定就是不包含條件中的字符串。

經(jīng)典的例子就是windows(?=2000|Vista)敛摘,首先固定字符串是windows,即字符串中一定要包含windows乳愉。條件字符串是包含2000或者Vista兄淫,所以windows2000和windowsVista都可以正確匹配屯远,這是正向肯定預(yù)查。舉一反三的你相信正向否定捕虽,反向肯定慨丐,反向否定都能理解了吧知道怎么用了吧。

此處我已經(jīng)假設(shè)你通過自己的感悟已經(jīng)理解了反向預(yù)查泄私,只寫式子了(如果沒明白在慢慢想會(huì)房揭,想累了就回頭看看Level1最后的圖片??)。

  • (?<=pattern) 反向肯定預(yù)查
  • (?<!pattern) 反向否定預(yù)查

到這了你應(yīng)該已經(jīng)明白預(yù)查的含義晌端,但是你跟我說你記不住這稀奇古怪的表達(dá)式捅暴。沒關(guān)系,看好了咧纠,劃重點(diǎn)啊蓬痒,考試專門考這啊,老司機(jī)給你拆開:

“漆羔?”代表預(yù)查

“=”代表肯定

“!”代表否定

“<”代表反向

好了梧奢,你可以準(zhǔn)備好仰天長嘯了,大喊還有誰演痒!

還有誰亲轨!

恩,別嘚瑟鸟顺,還有我惦蚊!

事實(shí)上,我們用預(yù)查方式诊沪,更多的用到的是正向預(yù)查(反向預(yù)查通常有點(diǎn)反人類思維)养筒,而且用到他的變體更多:

  • (?=[pattern]+$) 告訴我這是什么?“?”看到?jīng)]有端姚,預(yù)查晕粪,“=”看到?jīng)]有?肯定預(yù)查渐裸,有沒有“<”巫湘?沒有,正向肯定預(yù)查昏鹃!簡不簡單I蟹铡!6床场T乃弧!額外解釋一下,+等價(jià)于{1,}讯柔,$代表的是字符串結(jié)尾(所以說一些特殊的助記符真的是可以多學(xué)學(xué)的)抡蛙。

所以這個(gè)條件如果放在一個(gè)表達(dá)式的最開始就說明:

1.固定字符串沒有,那么條件字符串就是開頭了

2.條件字符串至少一個(gè)

3.條件字符串匹配到字符串結(jié)尾魂迄,所以條件字符串就是字符串結(jié)尾了

所以說結(jié)論是什么粗截?就是字符串從頭到尾都由pattern組成,也就是allIs捣炬。

  • (?!.*[pattern].*) 告訴我這是啥熊昌?誒對了,正向否定預(yù)查湿酸!老司機(jī)再帶你捋一個(gè)啊婿屹。

1.固定字符串沒有,條件字符串開頭了

2.條件字符串由任意任意字符開頭稿械,中間是條件字符串选泻,后面又是任意個(gè)數(shù)任意字符,說明什么美莫,條件就是包含pattern對吧页眯!

3.這是什么?否定預(yù)查厢呵,所以是什么窝撵?不包含!

結(jié)論襟铭?字符串不包含pattern碌奉,什么意思?從頭到尾都不是pattern寒砖,對不對赐劣?!Aǘ肌魁兼!allNot,誒漠嵌,英語就是這么溜咐汞!

那么老司機(jī)就不一一帶著你捋了,自己感悟叭迓埂化撕!

  • (?![pattern]+$) 直接給我說答案?是什么约炎?誒植阴,不全是pattern對不對?英語是什么?掠手?notAll热芹!

  • (?=.*[pattern]) 是不是包含?是不是惨撇!誒,對了府寒!contain魁衙!對不對!V晟ΑF实怼!就問你對不對纤房!

現(xiàn)在來纵隔,給我回到上面的需求,同時(shí)包含字母和數(shù)字怎么寫炮姨?

是不是((?=.*\d)(?=.*[a-zA-Z]))[\da-zA-Z]*?!簡單不簡單捌刮,透徹不透徹!J姘丁绅作!
這回是不是又覺得自己無敵了!還有誰6昱伞6砣稀!

別鬧洪乍,還有我啊~

還有我啊~

Level3

還有什么眯杏?還有多著呢,那么多助記符壳澳、那么多控制符岂贩、負(fù)值字符范圍、邊界匹配钾埂、獲取匹配河闰、貪婪模式等等。褥紫。姜性。

恩,我發(fā)現(xiàn)關(guān)注的人很多髓考,所以今天來把Level3中內(nèi)容補(bǔ)充一下部念。

  • ^ 負(fù)字符范圍。表示排除此字符集的其他范圍。[^\d]即標(biāo)識(shí)除數(shù)字外的其他字符合集儡炼。

實(shí)際使用中妓湘,他是可以配合預(yù)查來完成一些任務(wù)。
比如說要表示除了4的數(shù)字合集乌询,你可以有幾種表達(dá)方式:

  • [012356789]
  • [0-3,5-9]
  • (?=\d+$)([^4]*)

前兩個(gè)不說了榜贴,可讀性很強(qiáng),第三個(gè)妹田,先是預(yù)查并且是allIs模式對吧唬党,就限制了全由數(shù)字組成,然后用負(fù)字符范圍排除了4鬼佣,這樣就是排除了4的數(shù)組集合驶拱。不過你可能說你用第二種方式可讀性高且也符合,不過如果需求編程全部中文排除“我們”這兩個(gè)字符呢晶衷,你要怎么搞蓝纲。。所以說它是有它的應(yīng)用范圍的晌纫。沒有最合理的税迷,只有最適合的

  • \b 邊界匹配锹漱,要求表達(dá)式要在字符串的邊界翁狐。此處邊界通常以結(jié)尾或者空格進(jìn)行區(qū)分。

eg.比如說要匹配所有以er結(jié)尾的字符串凌蔬,你可以這樣[a-z]*(er)\b露懒,他能匹配her,但是verb就不行砂心。
同樣的\B就是不在邊界懈词。

  • 貪婪模式,及盡可能的多去匹配辩诞。我們的正則引擎一般是默認(rèn)貪婪模式的坎弯。如果想切換為非貪婪模式則在范圍表達(dá)式后添加"?"來表示當(dāng)前為非貪婪模式。

eg.字符串a(chǎn)bcdefg译暂,你要獲取不重復(fù)的所有長度至少為2的子串抠忘,你可以這樣寫[a-z]{2,},這時(shí)你獲得的結(jié)果將只有一個(gè)abcdefg,因?yàn)樨澙纺J较聲?huì)盡可能的多匹配,而下限是2上限沒有外永,所以匹配到整串結(jié)果崎脉。如果你這樣寫[a-z]{2,}?,那么當(dāng)前條件被轉(zhuǎn)換為非貪婪模式伯顶。你獲得的結(jié)果是ab囚灼、cd骆膝、ef三個(gè)結(jié)果。

  • 獲取與非獲取灶体,準(zhǔn)確的說這不是作為條件出現(xiàn)的阅签。上文中提到的括號(hào)表達(dá)式,就是否會(huì)獲取結(jié)果蝎抽。如上述中提到的預(yù)查模式政钟,實(shí)際上都是非獲取模式,就是并不會(huì)保存結(jié)果樟结,只是提前對整串進(jìn)行校驗(yàn)锥涕。而獲取匹配到的結(jié)果并供后面的表達(dá)式使用。這個(gè)還是比較難以理解的狭吼,老司機(jī)要配合例子或許你才能懂。

eg.需求1. 找出字符串a(chǎn)bbbccc中任意連續(xù)出現(xiàn)3次的字母殖妇。
乍一看任意連續(xù)出現(xiàn)三次的字母你怎么寫刁笙?[a-z]{3}這樣么?這樣子可不行谦趣,這可沒規(guī)定連續(xù)疲吸。首先我們知道,一個(gè)正則表達(dá)式是由多個(gè)正則表達(dá)式組成的前鹅。所以你現(xiàn)在想的是不是我獲取到一個(gè)符合結(jié)果的字符串摘悴,他的表達(dá)式應(yīng)該由兩部分組成,第一部分是匹配我要的第一個(gè)字母舰绘,第二部分是把第一部分匹配的字母重復(fù)兩次蹂喻。([a-z])這樣你獲取到的第一個(gè)字母澄干,然后我要使用第一個(gè)表達(dá)式的結(jié)果重復(fù)兩次苹享。所以你應(yīng)該這么寫([a-z])\1{2}悦穿。老司機(jī)解釋一下怎爵,這個(gè)表達(dá)式的意思是分成兩部分([a-z])獲取任意字符并將其保存在臨時(shí)的地方作為一個(gè)后面可用的條件子串喷众。\1代表取出第一個(gè)臨時(shí)子串灾梦,{2}就是范圍限定符恳守,將前面取出的元素重復(fù)兩次峦耘。所以abbbcbb中驳概,當(dāng)?shù)谝粋€(gè)字母a作為([a-z])所保存的臨時(shí)子串時(shí)赤嚼,\1就代表a,然而并沒有連續(xù)的三個(gè)a顺又,所以不符合更卒。當(dāng)b作為臨時(shí)子串時(shí),\1代表b稚照,后面有兩個(gè)連續(xù)的b逞壁,符合結(jié)果流济。

再來一個(gè)深入理解一下。如果我想取出abbbccc中的bccc怎么辦呢腌闯?我們的表達(dá)式應(yīng)該由3部分組成绳瘟,第一部分匹配一個(gè)字母,第二部分匹配一個(gè)字母,第三部分是第二部分重復(fù)兩次姿骏。([a-z])([a-z])\2{2}么糖声?不對,為什么分瘦?這樣你將獲取到abbb蘸泻。因?yàn)閍配[a-z],然后b匹配第二個(gè)[a-z]嘲玫,然后取出第二個(gè)結(jié)果b重復(fù)兩次悦施,那就是abbb。然后將從c開始繼續(xù)檢查后面的字符串去团。不過至少我們思路對了抡诞,只要我們不然abbb符合結(jié)果即可,簡單修改([^a])([a-z])\2{2}土陪。這時(shí)a就不能作為第一個(gè)字母出現(xiàn)了昼汗,所以就輪到bccc了是吧。

最后一個(gè)例子不分拆講解鬼雀,想獲取abbbcbb中的bcbb怎么辦顷窒?看看是不是這個(gè)表達(dá)式:([a-z])([a-z])\1{2}。對的源哩,不解釋鞋吉。

其余就是助記符了,雖然多励烦,但都是等價(jià)替換坯辩,老司機(jī)不細(xì)講,看看最開始的表吧崩侠。

助記符不算漆魔,另一種表達(dá)方式,控制符也就是幾個(gè)特殊符號(hào)却音,負(fù)值改抡、邊界用起來也很簡單,獲取匹配系瓢、貪婪模式阿纤,多看看也能消化。而且這些Level3的東西都是錦上添花的東西夷陋,不必須掌握欠拾。

所以大聲告訴我胰锌,正則會(huì)沒會(huì)!C暾资昧!

會(huì)!

簡不簡單>H獭8翊!

簡單刹枉!

老司機(jī)屌不屌_闯!微宝!

屌棺亭!真屌!太屌了蟋软!非常之屌镶摘!24K純屌!


然后放一些老司機(jī)搜集并驗(yàn)證過的常用正則吧:

類別 表格
數(shù)字 \d+
字母 [a-zA-Z]+
中文 [\u4E00-\u9FA5]+
所有符號(hào) [\W_]+
Email ^[A-Za-z\d]+([-_.][A-Za-z\d]+)@([A-Za-z\d]+[-.])([A-Za-z\d]+[.])+[A-Za-z\d]{2,5}$
手機(jī)號(hào)碼 1[34578]\d{9}
座機(jī)電話 (0[\d]{2,3}-)?([2-9][\d]{6,7})(-[\d]{1,4})?
自然數(shù) \d+(\.\d+)?

URL這個(gè)放在表格里面格式就不對了钟鸵,我就放外面了:
URL = ((http|ftp|https)://)?((([a-zA-Z0-9]+[a-zA-Z0-9_-]*\.)+[a-zA-Z]{2,6})|(([0-9]{1,3}\.){3}[0-9]{1,3}(:[0-9]{1,4})?))((/[a-zA-Z\d_]+)*(\?([a-zA-Z\d_]+=[a-zA-Z\d\u4E00-\u9FA5\s\+%#_-]+&)*([a-zA-Z\d_]+=[a-zA-Z\d\u4E00-\u9FA5\s\+%#_-]+))?)?


沖著老司機(jī)情人節(jié)不開房開博客的情懷,是不是應(yīng)該有一大波贊5佣恪9姿!!一大波關(guān)注V钟!C膳邸!嫩挤!一大波star:Ψ!F裾选R韵帧!


不過熟悉老司機(jī)的童靴是知道老司機(jī)的套路的约啊,老司機(jī)講課要什么邑遏?

要贊!要關(guān)注G【亍记盒!要star!M飧怠纪吮!

這期帶來的小工具:

DWRegexUtils

正則工具類俩檬,這也是老司機(jī)的心血結(jié)晶啊,提供自然人思維的鏈?zhǔn)秸Z法優(yōu)雅的返回正則表達(dá)式碾盟。

雖然這點(diǎn)難以解釋

預(yù)置常用正則表達(dá)式棚辽。

預(yù)置校驗(yàn)1
預(yù)置校驗(yàn)2

提供正則判斷的工具類!

如果覺得好用可以給整個(gè)倉庫一個(gè)star喲巷疼!整個(gè)倉庫里面全都是工具類喲晚胡!上哪里去找這么好的倉庫!=姥亍估盘!倉庫傳送門


有童鞋說這個(gè)工具類不會(huì)使用,恩骡尽,我理解遣妥!因?yàn)樘峁┑淖杂啥容^廣所以傳參比較多,所以老司機(jī)昨天發(fā)博客的時(shí)候自己想捋捋怎么用也回憶了一小下攀细,那我就簡單說一下吧箫踩。

首先,需明確的概念是谭贪,在這個(gè)工具類中境钟,老司機(jī)是想以一種組件的形式去生成正則表達(dá)式。組件對應(yīng)的就是正則表達(dá)式中元素的概念俭识。
從頭文件中可以看到慨削,老司機(jī)使用一個(gè)枚舉(嚴(yán)格點(diǎn)這是按位掩碼)定義了組件類型DWRegexComponent。使用的時(shí)候你可以
DWRegexComponentNumber |DWRegexComponentUppercaseLetter這樣來表示數(shù)字和大寫字母同時(shí)作為組件元素套媚。

第二個(gè)概念是條件缚态。其實(shí)上面的教程里你應(yīng)該發(fā)現(xiàn)了正則就是用一個(gè)個(gè)小的表達(dá)式組成一個(gè)大的表達(dá)式。而老司機(jī)這里就是一添加條件的方式來添加表達(dá)式堤瘤。我用了另一個(gè)枚舉類型DWRegexCondition定義了6種條件方式玫芦。其中4種是預(yù)查,allIs本辐,allNot桥帆,notAll,contain慎皱,這些都是預(yù)查條件环葵,所有都有PreSearch前綴。還有兩種子式條件contain和without宝冕,即包含與非包含张遭。

恩,兩個(gè)枚舉完事了地梨,搞定剩下三個(gè)api菊卷,你就能用它寫出正則了缔恳。

說說為什么會(huì)是鏈?zhǔn)秸Z句呢?因?yàn)?code>鏈?zhǔn)秸Z句從形式上更能代表人的順向思維洁闰,所謂想到哪寫到哪歉甚,所以采用了鏈?zhǔn)秸Z句生成正則,用過masonry的童鞋一定可以很快上手扑眉。

首先調(diào)用+dw_GetRegexStringWithMaker:方法來以block形式生成正則語句纸泄。

一下三個(gè)api都可以通過maker的點(diǎn)語法點(diǎn)出來,類比masonry就好了腰素。

AddConditionWithComponentType()

這個(gè)方法你要傳6個(gè)參數(shù)聘裁,有點(diǎn)多呵呵??。
分別是組件弓千、額外字符串衡便、條件、最小匹配數(shù)洋访、最大匹配數(shù)及是否為貪婪模式镣陕。
有了枚舉的介紹其實(shí)你應(yīng)該僅不知道額外字符串是什么鬼。
首先以組件來做成基本元素姻政,然而老司機(jī)預(yù)置的組件中可能不能代表全部你要的元素呆抑,所以可以通過額外字符串來對組件進(jìn)行補(bǔ)充。然后以組件和額外字符串作為元素汁展,配合條件即范圍生成一條正則表達(dá)式鹊碍。
上圖例子中的,詳情請見上面圖的第一個(gè)表達(dá)式善镰。

AddConditionWithComponentRegexString()

舉一反三的想一下妹萨,套路是一樣的年枕。你需要5個(gè)參數(shù)炫欺,子串、條件熏兄、兩端范圍及貪婪模式品洛。
應(yīng)用場景就是你不想用組件模式生成元素,而是想手?jǐn)]一個(gè)元素集合時(shí)摩桶,子串即傳入你的元素集合桥状,在添加條件、范圍即可硝清,例子見第二個(gè)表達(dá)式辅斟。

AddConditionWithCompleteRegexString()

僅需要傳入兩個(gè)參數(shù),即你連范圍都能自己擼芦拿,你就寫一個(gè)完整的正則表達(dá)式作為元素士飒,添加條件組成一個(gè)更加豐富的正則表達(dá)式查邢。

所以說借助這三個(gè)api加以你靈活的使用你就能生成所有你想要的表達(dá)式,只要你能夠把大需求拆分成一個(gè)個(gè)小條件酵幕。事實(shí)上第一個(gè)api自由度最高扰藕,你熟練使用這個(gè)就行

最后芳撒,這三個(gè)api中如果你的條件模式為預(yù)查邓深,則無論你在什么位置添加條件,最后都會(huì)自動(dòng)的拼接在正則表達(dá)式的前方笔刹。而子式條件添加的順序即為子式的順序芥备。

恩,有了講解配合上面的例子徘熔,這個(gè)工具類應(yīng)該就可以使用了门躯。不是吹捧自己的東西,只要熟練使用第一個(gè)api你真的能寫出所有正則酷师,你需要的只是學(xué)習(xí)一個(gè)api的成本讶凉。另外,用多了或許你就能很好的拆分了山孔,然后自己也就能寫了懂讯。


另外,DWCoreTextLabel已經(jīng)全面支持自動(dòng)鏈接匹配了台颠,包括數(shù)字褐望、email、url鏈接串前、手機(jī)號(hào)等瘫里。歡迎star!5茨搿谨读!跪求star!L秤酢劳殖!這是老司機(jī)主力推的庫??。

軟廣:

DWCoreTextLabel更新到現(xiàn)在已經(jīng)1.1.6版本了拨脉,現(xiàn)在除了圖文混排功能哆姻,還支持文本類型的自動(dòng)檢測,異步繪制減少系統(tǒng)的卡頓玫膀,異步加載并緩存圖片的功能矛缨。

version 1.1.0
全面支持自動(dòng)鏈接支持、定制檢測規(guī)則、圖文混排箕昭、響應(yīng)事件
優(yōu)化大部分算法誉简,提高響應(yīng)效率及繪制效率

version 1.1.1
高亮取消邏輯優(yōu)化
自動(dòng)檢測邏輯優(yōu)化
部分常用方法改為內(nèi)聯(lián)函數(shù),提高運(yùn)行效率

version 1.1.2
繪制邏輯優(yōu)化盟广,改為異步繪制(源碼修改自YYTextAsyncLayer)

version 1.1.3
異步繪制改造完成闷串、去除事務(wù)管理類,事務(wù)管理類仍可改進(jìn)筋量,進(jìn)行中

version 1.1.4
事務(wù)管理類去除烹吵,異步繪制文件抽出

version 1.1.5
添加網(wǎng)絡(luò)圖片異步加載庫,支持繪制網(wǎng)絡(luò)圖片

DWCoreTextLabel

插入圖片桨武、繪制圖片肋拔、添加事件統(tǒng)統(tǒng)一句話實(shí)現(xiàn)~

一句話實(shí)現(xiàn)

盡可能保持系統(tǒng)Label屬性讓你可以無縫過渡使用~

無縫過渡

恩,說了這么多呀酸,老司機(jī)放一下地址:DWCoreTextLabel凉蜂,寶寶們給個(gè)star吧愛你喲

愛你喲
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市性誉,隨后出現(xiàn)的幾起案子窿吩,更是在濱河造成了極大的恐慌,老刑警劉巖错览,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纫雁,死亡現(xiàn)場離奇詭異,居然都是意外死亡倾哺,警方通過查閱死者的電腦和手機(jī)轧邪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羞海,“玉大人忌愚,你說我怎么就攤上這事∪吹耍” “怎么了硕糊?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長申尤。 經(jīng)常有香客問我癌幕,道長衙耕,這世上最難降的妖魔是什么昧穿? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮橙喘,結(jié)果婚禮上时鸵,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好饰潜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布初坠。 她就那樣靜靜地躺著,像睡著了一般彭雾。 火紅的嫁衣襯著肌膚如雪碟刺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天薯酝,我揣著相機(jī)與錄音半沽,去河邊找鬼。 笑死吴菠,一個(gè)胖子當(dāng)著我的面吹牛者填,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播做葵,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼占哟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酿矢?” 一聲冷哼從身側(cè)響起榨乎,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘫筐,沒想到半個(gè)月后谬哀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡严肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年史煎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驳糯。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篇梭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酝枢,到底是詐尸還是另有隱情恬偷,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布帘睦,位于F島的核電站袍患,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竣付。R本人自食惡果不足惜诡延,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望古胆。 院中可真熱鬧肆良,春花似錦筛璧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巫糙,卻和暖如春朗儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背参淹。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工采蚀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人承二。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓榆鼠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亥鸠。 傳聞我的和親對象是個(gè)殘疾皇子妆够,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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