亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

在Swift中如何使用正則表達式詳解

2020-03-09 17:31:28
字體:
來源:轉載
供稿:網友

前言

正則表達式,又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。

正則表達式(Regular expression, regex)允許我們在幾秒鐘內在成千上萬文檔間進行復雜檢索與替換,自從誕生50多年來它依舊廣泛使用。

Swift雖然是一個新出的語言,但卻不提供專門的處理正則的語法和類。所以我們只能使用古老的NSRegularExpression類進行正則匹配。

在這篇文章中,我會講解在Swift中正則表達式的基本用法。我們會從易到難,詳細講解一些最重要的正則表達式語法,以及一些有用的擴展。

NSRegularExpression:如何在字符串中匹配正則表達式

NSRegularExpression類讓我們可以用正則表達式查找替換子字符串,它可以簡潔靈活地描述文本。例如,如果你想從"My name is Taylor Swift"中提取出"Taylor Swift",可以寫一個匹配文本“My name is”的正則表達式,它的后面可以是任何文本,之后把它傳遞給NSRegularExpression類。

具體可見下面代碼。注意我們要提取出的是第二范圍,因為第一范圍是匹配的字符串,而第二范圍才是"Taylor Swift"部分。

do { let input = "My name is Taylor Swift" let regex = try NSRegularExpression(pattern: "My name is (.*)", options: NSRegularExpression.Options.caseInsensitive) let matches = regex.matches(in: input, options: [], range: NSRange(location: 0, length: input.utf16.count)) if let match = matches.first {  let range = match.range(at:1)  if let swiftRange = Range(range, in: input) {   let name = input[swiftRange]  } }} catch { // regex was bad!}

正則表達式的詳細講解

讓我們從幾個簡單例子開始,方便不熟悉的人了解正則表達式。正則表達式,簡稱regex,用于讓我們在字符串中進行模糊檢索。例如我們知道”cat”包含”at”,但如果我們檢索所有以“at”結尾的3字母單詞該怎么做呢?

正則表達式就用于解決這個問題,盡管由于Objective-C的基礎,它們的語法有些不太靈巧。

1. 首先,定義你想檢索的字符串:

let testString = "hat"

之后創建NSRange實例來表示整個字符串的長度

let range = NSRange(location: 0, length: testString.utf16.count)

這里使用utf16來避免類似表情符號等帶來的問題

2. 之后使用正則表達式語法創建NSRegularExpression實例

let regex = try! NSRegularExpression(pattern: "[a-z]at")

[a-z]在正則表達式中用于指定a到z之間任意字母。實際使用中你可能會提供一個無效的正則表達式,但是這里我們有了一個硬編碼的正確正則表達式,所以就不需要查找錯誤了。

3. 最后在創建好的正則表達式調用firstMatch(in:),輸入要檢索的字符串,一些特殊選項,和字符串的范圍。如果字符串匹配正則表達式,就會返回數據,否則就是nil。所以如果你想檢查字符串是否完全匹配,就用firstMatch(in:)的結果和nil比較:

regex.firstMatch(in: testString, options: [], range: range) != nil

這里必須要用到NSRange——盡管這個API是為NSString設計,和Swift銜接的不太好。Swift String Manifesto可能會替換它,但看起來還要很久。

正則表達式“[a-z]at”會成功匹配“hat”,和“cat”, “sat”, “mat”, “bat”等等——我們只要關注想匹配什么,NSRegularExpression會處理好它。

讓NSRegularExpression用起來更簡單

接下里會展示更多的正則表達式語法,首先來看看如何讓NSRegularExpression稍微好用一些

現在我們的要3行Swift代碼來匹配一個簡單字符串

let range = NSRange(location: 0, length: testString.utf16.count)let regex = try! NSRegularExpression(pattern: "[a-z]at")regex.firstMatch(in: testString, options: [], range: range) != nil

我們可以從多種方式改進,不過最有效的是擴展NSRegularExpression,讓創建和匹配表達式更簡單。

首先第一行:

let regex = try! NSRegularExpression(pattern: "[a-z]at")

我提到過,創建一個NSRegularExpression實例可能導致錯誤,因為可能會提供一個非法的正則表達式。比如[a-zat,忘記了]

結果就是,通常會用try!創建NSRegularExpression實例。然而這會導致lint工具(如SwiftLint)的破壞。所以好一點的方法是創建一個方便的初始化,能正確創建正則表達式,或者在開發時能生成一個斷言失敗。

extension NSRegularExpression { convenience init(_ pattern: String) {  do {   try self.init(pattern: pattern)  } catch {   preconditionFailure("Illegal regular expression: /(pattern).")  } }}

注意:如果你的app需要用戶寫正則表達式,你需要使用NSRegularExpression(pattern:)初始化,這樣可以更好的處理錯誤。

之后這些行:

let range = NSRange(location: 0, length: testString.utf16.count)regex.firstMatch(in: testString, options: [], range: range) != nil

第一行創建了一個包含整個字符串的NSRange,第二行則是在文本中查找first match。但這是很笨的方法,因為大多時候你想查找輸入的整個字符串,用firstMatch(in:)與nil判定會弄混你的意圖。

所以,用另一個擴展來替代它,它把下面代碼包含在一個簡單的matches()方法中。

extension NSRegularExpression { func matches(_ string: String) -> Bool {  let range = NSRange(location: 0, length: string.utf16.count)  return firstMatch(in: string, options: [], range: range) != nil }} 

如果你把這兩個擴展合并,就可以更輕松的創建和檢索正則表達式了。

let regex = NSRegularExpression("[a-z]at")regex.matches("hat") 

我們可以進一步通過運算符重載讓Swift包含的,~=,運算符適用于正則表達式:

extension String { static func ~= (lhs: String, rhs: String) -> Bool {  guard let regex = try? NSRegularExpression(pattern: rhs) else { return false }  let range = NSRange(location: 0, length: lhs.utf16.count)  return regex.firstMatch(in: lhs, options: [], range: range) != nil }}

通過上面代碼,我們可以在一句話的左邊使用任意字符,右邊用正則表達式。

"hat" ~= "[a-z]at"

注意:創建NSRegularExpression實例會有一定消耗,所以如果你想要反復使用一個正則表達式,最好把NSRegularExpression實例保存起來。

正則表達式語法學之旅

我們已經使用了[a-z]來表示“a”到“z”之間任意字母,在正則表達式中這是一個字符類。它讓你指定要匹配的一組字母,可以通過制定的字母列表匹配,或者通過一段字符范圍匹配。

正則表達式范圍不一定是整個字母表,你可以用[a-t] 來排除“u”到“z”之間的字母。另外,如果你想特別指定一些字母,只需要像這樣單獨列出它們:

[csm]at

正則表達式默認區分大小姐寫,也就是說“Cat”和“Mat”不會在“[a-z]at”被匹配。如果你想忽略大小寫,可以使用“[a-zA-Z]at”,或者創建你自己的NSRegularExpression對象,并標記.caseInsensitive

除了大小寫以外,你可以通過字符類指定數字范圍。最常用的是[0-9]表示任何數字,或[A-Za-z0-9]表示任何字母數字混編字符,也可以用[A-Fa-f0-9]來表示16進制數字。

如果你想匹配一個字符序列,還需要一個叫做量詞(quantifier)的概念。它用于表示字符出現的數量。

最常用的是星號量詞,*,意思是匹配0個或更多。量詞在它們修飾的字符后出現,就像下面這樣:

let regex = NSRegularExpression("ca[a-z]*d")

這句話先查找“ca”,之后是0或多個從“a”到“z”的字母,最后是“d”——它能匹配“cad”, “card”, “clamped”等等。

除了*之外,還有2個類似的量詞 + 和 ? 。 + 意味著“1個或更多”,與 * 的“0個或更多”有點區別。而 ? 的意思是”0或1個”

這些量詞是正則表達式基礎內容,希望大家能確實理解它們的區別,比如下面3個正則表達式

  • ca[a-z]*d
  • ca[a-z]+d
  • ca[a-z]?d

并想想如果給出字符串“cd”或“clamped”,哪些能夠匹配。

如果需要,可以用大括號 { 和 } 來更詳細的指定匹配數量,比如[a-z]{3}意味著匹配3個小寫字母。

考慮一個電話號碼格式比如111-1111。如果要正好匹配這個格式,用[0-9-]+是行不通的。所以我們需要用這樣的正則表達式[0-9]{3}-[0-9]{4},即先是3個數字,之后連接號,之后4個數字。

此外還可以用大括號指定范圍,它可以是有界限的或無界限的。比如[a-z]{1,3}代表匹配1,2,或3個小寫字母。[a-z]{3,}代表匹配3個或更多個

最后,元字符(meta-characters)是特殊字符,正則表達式中有特別的意義,在這里介紹其中幾個使用最頻繁的。

首先其中是最常用,也是最濫用的 . 字符。它可以匹配除了換行符以外任意一個字符。比如正則表達式c.t可以匹配“cat”,但不能匹配“cart”。如果你把 . 和 * 量詞共同使用,就意味著匹配1個或多個除了換行符以外所有字符,這可能是你最常見的正則表達式了。

.* 常用的原因也顯而易見:不需要具體設計一個特別的正則表達式,.* 就可以匹配幾乎一切了。然而問題是,特定化本來就是正則表達式的要點之一,你可以在文本中精確查找一些字符并操作它們。而太多人完全依賴 .* ,卻沒有意識到這可能會給他們的表達式帶來難以察覺的錯誤。

用前面電話號碼的例子來說,我們用[0-9]{3}-[0-9]{4}匹配類似555-5555的電話號碼??紤]到有些人會寫成“555 5555”或“5555555”,我們可能就會把正則表達式條件放寬一些,改成[0-9]{3}.*[0-9]{4}

但是這樣就帶來一個問題,它會匹配“123-4567”, “123-4567890”, 或 “123-456-789012345”。為了讓[0-9]{3}與[0-9]{4}匹配上,.* 會匹配盡可能多的字符

所以這里要用字符類與量詞,比如[0-9]{3}[ -]*[0-9]{4},代表3個數字,之后0個或更多空格與連接線,之后4個數字?;蛘呤褂貌话址悾从盟鼇砥ヅ鋽底忠酝獾淖址?,如[0-9]{3}[^0-9]+[0-9]{4},會匹配空格,連接線,斜杠等等,而不會匹配數字。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
免费99精品国产自在在线| 2018中文字幕一区二区三区| 亚洲成人在线网| 日韩av电影免费观看高清| 日本aⅴ大伊香蕉精品视频| 欧美成人网在线| 国产精品免费一区豆花| 国产不卡一区二区在线播放| 欧美日韩高清区| 亚洲男人7777| 国产视频精品xxxx| 久久精品视频导航| 亚洲精品成人av| 欧美大秀在线观看| 国产精品私拍pans大尺度在线| 久久伊人91精品综合网站| 热99精品里视频精品| 国内偷自视频区视频综合| 成人精品视频99在线观看免费| 日韩美女免费视频| 亚洲片国产一区一级在线观看| 国产精品福利在线观看网址| 欧美成人网在线| 国产精品r级在线| 久久亚洲精品国产亚洲老地址| 中文字幕在线看视频国产欧美| 欧美精品在线播放| 亚洲香蕉伊综合在人在线视看| 日韩欧美在线免费| 国产专区精品视频| 国产精品99久久99久久久二8| 久久久久久高潮国产精品视| 伊人激情综合网| 国产精品福利片| 国产欧美最新羞羞视频在线观看| 国产日韩在线看片| 国产成人拍精品视频午夜网站| 欧美大片在线看| 久久久久久久国产精品| www国产亚洲精品久久网站| 欧美日韩一二三四五区| 国产日韩精品入口| 久久久精品亚洲| 精品久久久香蕉免费精品视频| 91久久国产综合久久91精品网站| 97国产精品视频人人做人人爱| 国产精品视频久久久| 国产亚洲人成网站在线观看| 欧美激情videos| 97av在线视频免费播放| 91美女片黄在线观| 久久人人看视频| 亚洲中国色老太| 久久99国产精品久久久久久久久| 青青精品视频播放| 亚洲欧美制服丝袜| 日韩电视剧在线观看免费网站| 国产精品免费看久久久香蕉| 亚洲激情视频网| 一本色道久久88综合亚洲精品ⅰ| 国产精品稀缺呦系列在线| 精品久久国产精品| 亚洲国产日韩欧美在线99| 日韩精品视频三区| 国产日韩精品综合网站| 国产午夜精品美女视频明星a级| 日韩欧美在线网址| 欧美在线视频一区二区| 欧美成人精品在线| 欧美一级淫片丝袜脚交| 色噜噜久久综合伊人一本| 欧美亚洲日本网站| 日本精品久久中文字幕佐佐木| 国产精品美女呻吟| 国产精品久久久久久久久免费| 性金发美女69hd大尺寸| 国产日韩欧美在线视频观看| 欧美亚洲视频一区二区| 尤物tv国产一区| 欧美精品在线视频观看| 亚洲综合中文字幕在线观看| 亚州国产精品久久久| 亚洲美女av电影| 亚洲午夜激情免费视频| 亚洲欧洲在线观看| 亚洲精品videossex少妇| 欧美国产乱视频| 久久精品中文字幕免费mv| 久久夜色精品国产欧美乱| 亚洲第一在线视频| 欧美精品在线免费观看| 日韩在线资源网| 狠狠做深爱婷婷久久综合一区| 亚洲人成电影网站色www| 国产精品久久婷婷六月丁香| 国产成人精品在线视频| 日韩有码在线播放| 欧美裸体xxxx| 成人黄色av播放免费| 亚洲国产精品久久久久秋霞不卡| 中文字幕精品国产| 92版电视剧仙鹤神针在线观看| 日韩精品免费在线视频| 亚洲一区二区久久久久久久| 欧美激情综合色| 亚洲女人初尝黑人巨大| 在线激情影院一区| 成人激情电影一区二区| 久热99视频在线观看| 国产一区二区成人| 欧美激情在线狂野欧美精品| 欧美另类老肥妇| 日韩免费视频在线观看| 久久99国产综合精品女同| 亚洲国产另类久久精品| 国产精品久久久久久av福利| 最新中文字幕亚洲| 欧美精品18videosex性欧美| 久久久之久亚州精品露出| 国产精品第一区| 中文字幕国产日韩| 欧美成人午夜激情在线| 国产美女精彩久久| 日韩欧美在线视频| 国产精品成人av性教育| 亚洲欧美日韩国产精品| 成人免费视频xnxx.com| 日韩在线观看你懂的| 色爱精品视频一区| 日韩精品中文字| 国产精品黄色影片导航在线观看| 伦伦影院午夜日韩欧美限制| 欧美日本黄视频| 亚洲变态欧美另类捆绑| 全球成人中文在线| 精品女厕一区二区三区| 午夜精品久久久久久久99黑人| 高清一区二区三区日本久| 国产欧美日韩专区发布| 欧美日韩一区二区免费在线观看| 精品久久久久久久久久久久久久| 91亚洲精品视频| 国产精品美女www| 精品日本美女福利在线观看| 午夜精品三级视频福利| 亚洲性线免费观看视频成熟| 久久精品国产久精国产思思| 日日骚av一区| 国产欧美日韩中文字幕| 中文字幕精品一区久久久久| 精品亚洲一区二区三区在线播放| 国产97在线播放| 热门国产精品亚洲第一区在线| 亚洲国产精彩中文乱码av在线播放| 日韩欧美成人区| 国产成人一区二区| 日韩美女视频在线观看| 国产综合在线视频| 久久免费国产精品1| 国产在线观看精品一区二区三区| 欧美亚洲国产日本| 在线日韩第一页| 欧美国产亚洲精品久久久8v| 一区二区三区视频免费在线观看|