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>
以上圖片截自百度百科正則表達(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ā)車了檐薯!
所以說單純一個(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_]+ |
^[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飧怠纪吮!
這期帶來的小工具:
正則工具類俩檬,這也是老司機(jī)的心血結(jié)晶啊,提供自然人思維的鏈?zhǔn)秸Z法優(yōu)雅的返回正則表達(dá)式碾盟。
預(yù)置常用正則表達(dá)式棚辽。
提供正則判斷的工具類!
如果覺得好用可以給整個(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ò)圖片
插入圖片桨武、繪制圖片肋拔、添加事件統(tǒng)統(tǒng)一句話實(shí)現(xiàn)~
盡可能保持系統(tǒng)Label屬性讓你可以無縫過渡使用~
恩,說了這么多呀酸,老司機(jī)放一下地址:DWCoreTextLabel凉蜂,寶寶們給個(gè)star吧愛你喲