歷史版本
版本號(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ù)~~~