萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> ios >> iOS開發之詳解正則表達式

iOS開發之詳解正則表達式

   正則表達式(廣為所知的“regex”)是一個字符串或一個字符序列來說明一種模式,把它作為一個搜索字符串-非常強大!

  在一個文本編輯器或文字處理器中普通的舊式搜索只允許你進行簡單的匹配。正則表達式可以實現這樣簡單的搜索,它還能讓你更進一步地按模式搜索,例如,在兩個數字後跟一個字母,或者,三個字母後跟一個連字符。

  這種模式匹配能讓你做更有用的事,如驗證字段(電話號碼,郵箱地址),檢查用戶輸入,執行更高級的文本操作等等。

  如果你渴望了解更多關於正則表達式在iOS中的用法,看一些本教程之外的內容--不需要有相關的經驗。

  在這篇NSRegularExpression教程中,你將實現一個在文本中按模式搜索的功能,用你希望的值替代那些匹配的值,驗證你的輸入信息,在文字塊中找到並高亮顯示復雜字符串。

  此外,我還將給你提供一個NSRegularExpression Cheat Sheet PDF,你可以打印出來,在你開發過程中作為參考,Swift playground 包含了很多例子,你能用它試驗出許多不同形式的正則表達式!實際上,所有正則表達式的例子都會出現在本教程中,用很生動的例子展現在playground中,一定要查看它們哦。

  閒話少說,是時候來處理正則表達式了。

  /The (Basics|Introduction)/

  Note:如果你已經有正則表達式基礎了,可以跳過頭部,直接看Implementing Regex in iOS.

  如果你是剛接觸正則表達式,並且想知道所說的這些是什麼意思,這是一個簡短的定義:正則表達式提供了一種在指定文本文檔中按指定模式進行搜索,並能基於匹配模式進行修改文本的一種方式。有許多關於正則表達式的有意思的書和教程--在本教程的結尾,你會看到一個簡短的列表。

  Regular Expressions Playground

iOS開發之詳解正則表達式 三聯

  在本教程中,你將會創建許多正則表達式,假使你想要可視化的使用它們,那麼用Swift Playground 是一個絕佳的方式 !

  這個starter project 包含了這個教程用到的playground。下載項目,在Xcode中運行並打開iRegex.playground.你也可以單獨下載這個playground(download the playground) 。

  Playground 頂部包含許多函數來高亮顯示在一小段文本中應用正則表達式的搜索結果,展示了一系列的匹配項和分組,還有替換文本。目前不要擔心這些方法的實現,之後你會再看到它們的,在Basic Examples和Cheat Sheet部分接著看這個例子。

  在playground的側邊欄,你會看到每個例子的匹配結果。比如“highlight”這個例子,你可以把鼠標指針懸浮在結果上並點擊“眼”或者空的圓圈圖標來顯示在文本中高亮的匹配內容。

  你之後將學會如何創建NSRegularExpressions,現在你可以用這個playground來感受下不同的正則表達式是怎樣工作的,也可以試驗一下你自己的模式。在任一點上你都可以用Xcode中的EEditor > Reset Playground菜單按鈕來重置你的改動。

  Examples

  讓我們以一個小例子來展示正則表達式的樣子。

  這是一個來匹配單詞“jump”的正則表達式的例子:

1 jump

  這是一個如此簡單的正則表達式。你可以使用iOS中可用的API來查詢一個文本中的字符串來匹配這個正則表達式—一旦你找到了匹配項,你能發現它在哪兒,你也可以替換它。

  這是一個略微復雜點的例子—它會匹配單詞“jump”或“jumping”:

1 jump(ing)?

  這是應用正則表達式支持的特殊字符的例子。這個圓括號創建了一個組,這個標志是說“匹配前面的元素(這種情況下的組)0次或1次”。

  現在來看一個復雜的例子。它會匹配一對開合的HTML標簽和他們之間的內容。

1 ]*>(.*?)

  喔,看起來好復雜,呃?不要擔心,在本教程的後面你將會學到正則表達式中的這些特殊字符,到時候你就能理解這是怎麼實現的了!

  如果你像了解之前的正則表達式的更多細節,請參考this discussion的解釋。

  Note: 在實際的應用中,你可能不會單獨用正則表達式來解析HTML(probably shouldn’t use regular expressions alone to parse HTML),相反而是用標准的XML解析器。

  Overall Concepts

  在看更深入的內容之前,理解一些關於正則表達式的核心概念很重要。

  字面字符(Literal characters)是最簡單地一種正則表達式。你已經很熟悉他們了,比如,文字處理機或文本編輯器中得“find”操作。例如,單個字符的正則表達式 t 就會找到字母“t”出現的所有地方,正則表達式 jump 會找出所有出現“jump”的地方。優美,簡潔!

  就像一種編程語言一樣,正則表達式的語法中也有一些保留字,如下:

  [

  ( and )

  

  *

  +

  ?

  { and }

  ^

  $

  .

  | (pipe)

  /

  這些字符被用作高級模式匹配。如果你想搜索這些字符中的一個,你需要用反斜線()轉義它,例如,為了搜索一個文本塊中的句號,不是用.,而是用.。

  每種環境,在Python、Perl、Java、C#、Ruby或者其他環境,在實現正則表達式時都有一些特殊的細微差別,在Swift中也不例外!

  無論Objective-C還是Swift,你在字面量字符串中都需要轉義一些特殊字符(在他們之前添加字符)。這其中一個字符就是反斜線自身!既然這個被用來創建正則表達式的模式也是字符串,在你處理String 和 NSRegularExpression,你需要轉義反斜線時, 這就增加了復雜性。

  這意味著在Swift(或者Objective-C)代碼中標准的.將會顯示為.。

  用以下兩點來澄清以上概念:

  字面的“.”定義了一個字符串:.

  正則表達式.則是匹配一個單個的句號字符.。

  截獲圓括號(capturing parentheses) 被用作組模式的一部分。例如:3 (pm|am)會匹配文本“3 pm” ,也會匹配“3 am”。豎線字符(|)執行的是或操作。只要你樂意,你可以包含多個豎線字符在你的正則表達式中。例如,(Tom|Dick|Harry)是一個有效的模式,它能匹配那三個名字中的任一個。

  當你需要選擇性的匹配特定的字符串時,圓括號組用起來很方便。比方說你要在一個文本中查找“November”,但是它可能被簡寫為“Nov”.你就能定義一個模式 Nov(ember)?,在捕獲圓括號(capturing parentheses)後加上問號,意味著這個圓括號內的內容是可選的。

  這個圓括號(parentheses)被定義為術語捕獲(capturing)因為他們捕獲匹配的內容,並允許在你的正則表達式的其他地方引用它。

  舉個例子,假使你有一個字符串“Say hi to Harry”.如果你創建一個搜索並替換的正則表達式,用that guy $1 來替換任一處出現的(Tom|Dick|Harry),結果就會是“Say hi to that guy Harry”.$1允許你引用前面規則中的第一個截獲組。

  捕獲組和非捕獲組是一些高級的話題,在本教程的後面你會遇到關於他們的例子。

  字符組(Character classes)相當於一組字符中匹配單個字符。字符組出現在中括號([ 和 ])之間。

  例如,正則表達式 t[aeiou]會匹配“ta”、“te”、“ti”、“to”或“tu”。你可以放任意多的字符在中括號中,但是請記住,只能匹配一個字符。[aeiou]看起來是五個字符,但它真實意義卻是“a”或”e“或”i“或”o“或”u“。

  如果字符連續出現,你也能在字符組中定義一個范圍。例如,為了搜索在100到109的數字,模式應該用10[0-9]。這和10[0123456789]會返回同樣地結果,不過,使用范圍來定義你的正則表達式看起來更簡潔和易於理解。

  字符組不止局限於數字,你同樣可以用字符來這樣做。比如,[a-f]會匹配”a“,”b“,”c“,”d“,”e“或”f“。

  字符集通常包含你想要匹配的字符,但是如果你想明確指出不要匹配的字符該怎麼辦?同樣你能定義除此之外的字符組,把^放在前面。例如,模式t[^o]就會匹配包含”t“並且後面緊跟的字符是非o的字符。

  NSRegularExpressions Cheat Sheet

  正則表達式是一個語法簡單但能組合成非常復雜的結果的絕佳例子!即使是一個正則表達式能手,也會再一些古怪的邊界問題上參考一些小抄。

  為了能幫助你理解,我們為你提供了正式的 raywenderlich.com的NSRegularExpression Cheat SheetPDF!請下載下來查看。

  除此之外,下面是cheat sheet的縮小版,和一些簡短的解釋:

  .匹配任一字符。p.p匹配pop,pup,pmp,p@p等等。

  w匹配任意“word-like”

copyright © 萬盛學電腦網 all rights reserved