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)),簡單的說就是表示任何字符串的意思,如果要查找字符串中的***符號(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)匹配的保存。反向引用的最簡單的、最有用的應(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容