ios正則表達(dá)式細(xì)說(一)

歷史版本

版本號(hào) 時(shí)間
V1.0 2017.07.07

前言

在ios中很多情況下都需要進(jìn)行專門的判斷焙格,比如判斷輸入的手機(jī)號(hào)是否正確,判斷輸入的郵箱格式是否正確匣沼,判斷輸入的字符串是否全是大寫字母瘪板,判斷輸入的是否全部都是數(shù)字,等等揩慕。我們要讓機(jī)器能夠進(jìn)行“自主”識(shí)別亭畜,就需要正則表達(dá)式的幫助,這里我們就說一下正則表達(dá)式的作用迎卤。

語法

要讓及其讀懂人寫的代碼拴鸵,還是要依法而行的,太隨心所欲,很明顯你會(huì)機(jī)器搞暈劲藐,也就無法工作八堡,下面我們就要看一下正則表達(dá)式的語法。

正則表達(dá)式也是由一些字符串組成的聘芜,但是他們的組成是有含義和規(guī)則的兄渺。正則表達(dá)式就是用一個(gè)“字符串”去驗(yàn)證另外一個(gè)“字符串”是否符合這個(gè)特征的式子,比如汰现,表達(dá)式"ab+"描述的意義就是一個(gè)a和若干個(gè)b的組合挂谍,則ab、abbb瞎饲、ab...b等都符合這個(gè)特征口叙,下面我們就看一下更詳細(xì)的語法。

一嗅战、單個(gè)字符的匹配

下面我們說一下單個(gè)字符的匹配妄田,下面我們先看個(gè)例子。

  • runoo+b驮捍,可以匹配 runoob疟呐、runooob、runoooooob 等东且,+ 號(hào)代表前面的字符必須至少出現(xiàn)一次(1次或多次)萨醒。
  • runoo*****b,可以匹配 runob苇倡、runoob、runoooooob 等囤踩,*** 號(hào)代表字符可以不出現(xiàn)旨椒,也可以出現(xiàn)一次或者多次(0次、或1次堵漱、或多次)综慎。
  • colou?r 可以匹配 color 或者 colour,? 問號(hào)代表前面的字符最多只可以出現(xiàn)一次(0次勤庐、或1次)示惊。

??構(gòu)造正則表達(dá)式的方法和創(chuàng)建數(shù)學(xué)表達(dá)式的方法一樣。也就是用多種元字符與運(yùn)算符可以將小的表達(dá)式結(jié)合在一起來創(chuàng)建更大的表達(dá)式愉镰。正則表達(dá)式的組件可以是單個(gè)的字符米罚、字符集合、字符范圍丈探、字符間的選擇或者所有這些組件的任意組合录择。
??正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串隘竭。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配动看。

二、普通字符

??普通字符包括沒有顯示指定為元字符的所有可打印字符菱皆,這包括所有的大寫字符、小寫字母搔预、所有數(shù)字、所有標(biāo)點(diǎn)符號(hào)和一些其他的符號(hào)拯田。

三、非打印字符串

非打印字符串也是正則表達(dá)式的組成部分船庇,下表列出了表示非打印字符的轉(zhuǎn)義序列吭产。

字符 描述
\cx 匹配由x指定的控制字符臣淤,例如:\cM匹配一個(gè)Conrtrol -M或回車符,x值必須為A-Z或a-z之一邑蒋,否則,將c視為一個(gè)原義的'c'字符按厘。
\f 匹配一個(gè)換頁符医吊,等價(jià)于\x0c和\cL。
\n 匹配一個(gè)換行符逮京,等價(jià)于\x0a和\cJ卿堂。
\r 匹配一個(gè)回車符,等價(jià)于\x0d和\cM懒棉。
\s 匹配任何空白字符草描,包括空格、制表符策严、換頁符等穗慕,等價(jià)于[\f\n\r\t\v]。
\S 匹配任何非空白字符妻导,等價(jià)于[^\f\n\r\t\v]揍诽。
\t 匹配一個(gè)制表符诀蓉,等價(jià)于\x09和\cl。
\v 匹配一個(gè)垂直制表符暑脆,等價(jià)于\x0b和\cK渠啤。

四、特殊字符

??所謂的特殊字符添吗,就是一些有特殊含義的字符沥曹,例如*(星號(hào)),簡(jiǎn)單的說就是表示任何字符串的意思碟联,如果要查找字符串中的***符號(hào)妓美,則需要對(duì)*進(jìn)行轉(zhuǎn)義,即在其前面加一個(gè)\鲤孵,runo\*ob匹配runo*ob壶栋。

??許多元字符都要求在匹配它們的時(shí)候要特別對(duì)待,若要匹配這些特殊字符普监,必須首先使字符“轉(zhuǎn)義”贵试,即,將\放在它們前面即可凯正。很多情況如下表所示毙玻。

特別字符 描述
$ 匹配輸入字符串的結(jié)尾位置,如果設(shè)置了RegExp對(duì)象的Multiline屬性廊散,則$也匹配了'\n'或'\r'桑滩,要匹配$字符本身,請(qǐng)使用$允睹。
() 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置,子表達(dá)式可以獲取供以后使用戳吝,要匹配這個(gè)字符,請(qǐng)使用(和)。
* 匹配前面的子表達(dá)式零次或多次塘雳,要匹配*字符普筹,請(qǐng)使用\*。
+ 匹配前面的子表達(dá)式一次或多次妻顶,要匹配+字符,請(qǐng)使用\+讳嘱。
. 匹配除換行符\n之外的任何單字符沥潭,要匹配.,請(qǐng)使用\.汇恤。
[ 標(biāo)記一個(gè)中括號(hào)表達(dá)式的開始拔恰,要匹配[,請(qǐng)使用\[财岔。
饭冬? 匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符昌抠,要匹配?字符裁厅,請(qǐng)使用\?侨艾。
將下一個(gè)字符標(biāo)記為特殊字符,或原義字符袋励、或向后引用茬故、或八進(jìn)制轉(zhuǎn)義符蚁鳖,例如:'n'匹配字符'n',‘\n’匹配換行符钾腺,序列‘\\’匹配""。
^ 匹配輸入字符串的開始位置放棒,除非在方括號(hào)表達(dá)式中使用,此時(shí)逗抑,它表示不接受該字符集合邮府,要匹配^字符本身溉奕,請(qǐng)使用^。
{ 標(biāo)記限定符表達(dá)式的開始仙辟,要匹配{鳄梅,請(qǐng)使用\{。
豎線 指明兩項(xiàng)之間的一個(gè)選擇粟焊,要匹配豎線项棠,請(qǐng)使用\加上豎線挎峦。

五、限定符

??限定符用來指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足的匹配透典,限定符一共有六種顿苇。

  • *
  • ?
  • {n}
  • {n,}
  • {n,m}

??具體的限定內(nèi)容其實(shí)前面我們都說過幾種了,下面我們就繼續(xù)說下邊的,看下表蜂科。

字符 描述
* 匹配前面的子表達(dá)式零次或者多次,例如:zo*能匹配“z”以及“zoo”导匣,等價(jià)于{0,}。
+ 匹配前面的子表達(dá)式一次或者多次赋访,例如蚓耽,'zo+'能匹配’zo‘以及'zoo'旋炒,但不能匹配'z',+等價(jià)于{1,}。
? 匹配前面的子表達(dá)式零次或者一次鼎兽,例如'do(es)铣除?'可以匹配'do'或’does‘,其等價(jià)于{0择卦,1}背苦。
{n} n是一個(gè)非負(fù)整數(shù)行剂,匹配確定的n次,例如腌巾,'o{2}'不能匹配’Bob‘中的’o‘铲觉,但是能匹配'food'中的兩個(gè)o。
{n,} n是一個(gè)非負(fù)整數(shù)灯荧,至少匹配n次盐杂,例如’o{2,}‘不可以匹配'Bob'中的'o',但能匹配'foooooood'中的所有o哆窿,’o{1,}‘等價(jià)于'o+'挚躯,’o{0,}‘則等價(jià)于’o*‘码荔。
{n,m} m,n均為非負(fù)整數(shù)感挥,其中n<=m,最少匹配n次誉己,最多匹配m次域蜗,例如'o{1,3}'將匹配'fooooood'中的前三個(gè)o,’o{0,1}‘等價(jià)于'o?'筑累,注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格慢宗。

六奔穿、定位符

??定位符使您能夠?qū)⒄齽t表達(dá)式固定到行首或者行尾,它們還能使您能夠創(chuàng)建這樣的正則表達(dá)式缅茉,這些表達(dá)式出現(xiàn)在一個(gè)單詞內(nèi)男摧,在一個(gè)單詞的開頭或者一個(gè)單詞的結(jié)尾。^$分別指字符串的開始與結(jié)束拇颅,span class="marked">\b描述單詞的前或后邊界樟插,span class="marked">\B表示非單詞邊界。

關(guān)于正則表達(dá)式的限定符如下表格所示麻献。

字符 描述
^ 匹配輸入字符串開始的位置猜扮,如果設(shè)置了RexExp對(duì)象的Multiline屬性旅赢,^還會(huì)與\n或\r之后的位置匹配惑惶。
$ 匹配輸入字符串結(jié)尾的位置,如果設(shè)置了RexExp對(duì)象的Multiline屬性僵控,^還會(huì)與\n或\r之前的位置匹配报破。
\b 匹配一個(gè)字邊界千绪,即字與空格間的位置。
\B 非字邊界匹配盹靴。

注意:

  • 不能將限定符與定位點(diǎn)一起使用瑞妇。由于在緊靠換行或者字邊界的前面或后面不能有一個(gè)以上位置,因此不允許諸如 ^* 之類的表達(dá)式改备。

  • 若要匹配一行文本開始處的文本绍妨,請(qǐng)?jiān)谡齽t表達(dá)式的開始使用 ^ 字符柬脸。不要將 ^ 的這種用法與中括號(hào)表達(dá)式內(nèi)的用法混淆。

  • 若要匹配一行文本的結(jié)束處的文本灾测,請(qǐng)?jiān)谡齽t表達(dá)式的結(jié)束處使用 $ 字符。

  • 若要在搜索章節(jié)標(biāo)題時(shí)使用定位點(diǎn)铭段,下面的正則表達(dá)式匹配一個(gè)章節(jié)標(biāo)題秦爆,該標(biāo)題只包含兩個(gè)尾隨數(shù)字等限,并且出現(xiàn)在行首。

/^Chapter [1-9][0-9]{0,1}/
  • 匹配字邊界稍有不同形娇,但向正則表達(dá)式添加了很重要的能力筹误。字邊界是單詞和空格之間的位置。非字邊界是任何其他位置哄酝。下面的表達(dá)式匹配單詞 Chapter 的開頭三個(gè)字符祷膳,因?yàn)檫@三個(gè)字符出現(xiàn)字邊界后面。
/\bCha/
  • \b 字符的位置是非常重要的万哪。如果它位于要匹配的字符串的開始奕巍,它在單詞的開始處查找匹配項(xiàng)儒士。如果它位于字符串的結(jié)尾,它在單詞的結(jié)尾處查找匹配項(xiàng)诅福。例如拖叙,下面的表達(dá)式匹配單詞 Chapter 中的字符串 ter,因?yàn)樗霈F(xiàn)在字邊界的前面咖气。
/ter\b/

  • 下面的表達(dá)式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt浅役。字符串 apt 出現(xiàn)在單詞 Chapter 中的非字邊界處觉既,但出現(xiàn)在單詞 aptitude 中的字邊界處乳幸。對(duì)于 \B 非字邊界運(yùn)算符,位置并不重要,因?yàn)槠ヅ洳魂P(guān)心究竟是單詞的開頭還是結(jié)尾演侯。
/\Bapt/

七、選擇

??用圓括號(hào)將所有選擇項(xiàng)括起來悬赏,相鄰的選擇項(xiàng)之間用|分割娄徊,但用圓括號(hào)會(huì)有一個(gè)副作用,是相關(guān)的匹配會(huì)被緩存兵多,此時(shí)可用?:放在第一個(gè)選項(xiàng)前來消除這種副作用剩膘。其中 ?: 是非捕獲元之一盆顾,還有兩個(gè)非捕獲元是 ?= 和 ?!,這兩個(gè)還有更多的含義奈懒,前者為正向預(yù)查宪巨,在任何開始匹配圓括號(hào)內(nèi)的正則表達(dá)式模式的位置來匹配搜索字符串,后者為負(fù)向預(yù)查茴丰,在任何開始不匹配該正則表達(dá)式模式的位置來匹配搜索字符串。

八峦椰、反向作用

??對(duì)一個(gè)正則表達(dá)式模式或部分模式兩邊添加圓括號(hào)將導(dǎo)致相關(guān)匹配存儲(chǔ)到一個(gè)臨時(shí)緩沖區(qū)中汰规,所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲(chǔ)溜哮。緩沖區(qū)編號(hào)從 1 開始,最多可存儲(chǔ) 99 個(gè)捕獲的子表達(dá)式餐茵。每個(gè)緩沖區(qū)都可以使用 \n 訪問述吸,其中 n 為一個(gè)標(biāo)識(shí)特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)〉琅可以使用非捕獲元字符 ?:入撒、?= 或 ?! 來重寫捕獲,忽略對(duì)相關(guān)匹配的保存璃赡。反向引用的最簡(jiǎn)單的献雅、最有用的應(yīng)用之一,是提供查找文本中兩個(gè)相同的相鄰單詞的匹配項(xiàng)的能力豆励。以下面的句子為例良蒸。


Is is the cost of of gasoline going up up?

??上面的句子很顯然有多個(gè)重復(fù)的單詞伍玖。如果能設(shè)計(jì)一種方法定位該句子,而不必查找每個(gè)單詞的重復(fù)出現(xiàn)串纺,那該有多好。下面的正則表達(dá)式使用單個(gè)子表達(dá)式來實(shí)現(xiàn)這一點(diǎn)纺棺。

var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/;
document.write(str.match(patt1));

后記

未完,待續(xù)~~~

風(fēng)景真美
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巨朦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拄查,老刑警劉巖棚蓄,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣疟,死亡現(xiàn)場(chǎng)離奇詭異睛挚,居然都是意外死亡急黎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門淤击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來污抬,“玉大人绳军,你說我怎么就攤上這事∩淙” “怎么了奶是?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵竣灌,是天一觀的道長(zhǎng)初嘹。 經(jīng)常有香客問我蛔屹,道長(zhǎng),這世上最難降的妖魔是什么漫贞? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任迅脐,我火速辦了婚禮豪嗽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隐锭。我一直安慰自己计贰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布荞怒。 她就那樣靜靜地躺著褐桌,像睡著了一般象迎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上完丽,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天拇舀,我揣著相機(jī)與錄音,去河邊找鬼聘鳞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抠璃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窿春,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旧乞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼磅氨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起延赌,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤叉橱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掐松,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锌杀,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糕再,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年突想,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猾担。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绑嘹,死狀恐怖橘茉,靈堂內(nèi)的尸體忽然破棺而出姨丈,到底是詐尸還是另有隱情擅腰,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布歼争,位于F島的核電站沐绒,受9級(jí)特大地震影響呀邢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜价淌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一蝉衣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧濒翻,春花似錦、人聲如沸有送。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阵赠。三九已至肌稻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枷邪,已是汗流浹背诺凡。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工药薯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留童本,地道東北人脸候。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像泵额,于是被迫代替她去往敵國和親携添。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 正則表達(dá)式到底是什么東西羞秤?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位瘾蛋,可能是字母,數(shù)字哺哼,標(biāo)點(diǎn)符號(hào)叼风,空格,換行符无宿,漢字等...
    獅子挽歌閱讀 2,147評(píng)論 0 9
  • 注:本篇文章只為方便查看懈贺,特此保留坡垫,如有冒犯,敬請(qǐng)諒解1啤!溉卓! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么搬泥,并對(duì)它...
    阿杰Alex閱讀 1,483評(píng)論 0 10
  • 簡(jiǎn)介 正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式忿檩。模式描述在搜索文...
    我為峰2014閱讀 496評(píng)論 0 2
  • 9.19--9.23 第7章 正則表達(dá)式 正則表達(dá)式是一個(gè)拆分字符串并查詢相關(guān)信息的過程燥透。 推薦練習(xí)網(wǎng)站: js ...
    如201608閱讀 1,027評(píng)論 0 4
  • 端坐屏前整日憂班套, 探知災(zāi)病幾時(shí)休。 身雖不動(dòng)居房?jī)?nèi)吱韭, 心系民生達(dá)九州鱼的。
    何逍云閱讀 262評(píng)論 0 7