最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Swift中如何使用正則表達(dá)式詳解

 更新時(shí)間:2018年09月04日 10:33:13   作者:游星啊  
正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,相信大家應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于在Swift中如何使用正則表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

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

正則表達(dá)式(Regular expression, regex)允許我們?cè)趲酌腌妰?nèi)在成千上萬文檔間進(jìn)行復(fù)雜檢索與替換,自從誕生50多年來它依舊廣泛使用。

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

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

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

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

具體可見下面代碼。注意我們要提取出的是第二范圍,因?yàn)榈谝环秶瞧ヅ涞淖址?,而第二范圍才?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!
}

正則表達(dá)式的詳細(xì)講解

讓我們從幾個(gè)簡(jiǎn)單例子開始,方便不熟悉的人了解正則表達(dá)式。正則表達(dá)式,簡(jiǎn)稱regex,用于讓我們?cè)谧址羞M(jìn)行模糊檢索。例如我們知道”cat”包含”at”,但如果我們檢索所有以“at”結(jié)尾的3字母單詞該怎么做呢?

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

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

let testString = "hat"

之后創(chuàng)建NSRange實(shí)例來表示整個(gè)字符串的長度

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

這里使用utf16來避免類似表情符號(hào)等帶來的問題

2. 之后使用正則表達(dá)式語法創(chuàng)建NSRegularExpression實(shí)例

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

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

3. 最后在創(chuàng)建好的正則表達(dá)式調(diào)用firstMatch(in:),輸入要檢索的字符串,一些特殊選項(xiàng),和字符串的范圍。如果字符串匹配正則表達(dá)式,就會(huì)返回?cái)?shù)據(jù),否則就是nil。所以如果你想檢查字符串是否完全匹配,就用firstMatch(in:)的結(jié)果和nil比較:

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

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

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

讓NSRegularExpression用起來更簡(jiǎn)單

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

現(xiàn)在我們的要3行Swift代碼來匹配一個(gè)簡(jiǎn)單字符串

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

我們可以從多種方式改進(jìn),不過最有效的是擴(kuò)展NSRegularExpression,讓創(chuàng)建和匹配表達(dá)式更簡(jiǎn)單。

首先第一行:

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

我提到過,創(chuàng)建一個(gè)NSRegularExpression實(shí)例可能導(dǎo)致錯(cuò)誤,因?yàn)榭赡軙?huì)提供一個(gè)非法的正則表達(dá)式。比如[a-zat,忘記了]

結(jié)果就是,通常會(huì)用try!創(chuàng)建NSRegularExpression實(shí)例。然而這會(huì)導(dǎo)致lint工具(如SwiftLint)的破壞。所以好一點(diǎn)的方法是創(chuàng)建一個(gè)方便的初始化,能正確創(chuàng)建正則表達(dá)式,或者在開發(fā)時(shí)能生成一個(gè)斷言失敗。

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

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

之后這些行:

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

第一行創(chuàng)建了一個(gè)包含整個(gè)字符串的NSRange,第二行則是在文本中查找first match。但這是很笨的方法,因?yàn)榇蠖鄷r(shí)候你想查找輸入的整個(gè)字符串,用firstMatch(in:)與nil判定會(huì)弄混你的意圖。

所以,用另一個(gè)擴(kuò)展來替代它,它把下面代碼包含在一個(gè)簡(jiǎn)單的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
 }
} 

如果你把這兩個(gè)擴(kuò)展合并,就可以更輕松的創(chuàng)建和檢索正則表達(dá)式了。

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

我們可以進(jìn)一步通過運(yùn)算符重載讓Swift包含的,~=,運(yùn)算符適用于正則表達(dá)式:

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
 }
}

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

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

注意:創(chuàng)建NSRegularExpression實(shí)例會(huì)有一定消耗,所以如果你想要反復(fù)使用一個(gè)正則表達(dá)式,最好把NSRegularExpression實(shí)例保存起來。

正則表達(dá)式語法學(xué)之旅

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

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

[csm]at

正則表達(dá)式默認(rèn)區(qū)分大小姐寫,也就是說“Cat”和“Mat”不會(huì)在“[a-z]at”被匹配。如果你想忽略大小寫,可以使用“[a-zA-Z]at”,或者創(chuàng)建你自己的NSRegularExpression對(duì)象,并標(biāo)記.caseInsensitive

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

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

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

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

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

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

這些量詞是正則表達(dá)式基礎(chǔ)內(nèi)容,希望大家能確實(shí)理解它們的區(qū)別,比如下面3個(gè)正則表達(dá)式

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

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

如果需要,可以用大括號(hào) { 和 } 來更詳細(xì)的指定匹配數(shù)量,比如[a-z]{3}意味著匹配3個(gè)小寫字母。

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

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

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

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

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

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

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

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例

    RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例

    這篇文章主要介紹了RxSwift發(fā)送及訂閱 Subjects、Variables代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 關(guān)于Swift 4.1中的Codable改進(jìn)詳解

    關(guān)于Swift 4.1中的Codable改進(jìn)詳解

    這篇文章主要給大家介紹了關(guān)于Swift 4.1中的Codable改進(jìn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • 深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)

    深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Swift中單例模式替換的相關(guān)資料,然后又跟大家分享了關(guān)于Swift3.0 單例模式實(shí)現(xiàn)的幾種方法-Dispatch_Once的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • swift中正確安全聲明一個(gè)單例的方法實(shí)例

    swift中正確安全聲明一個(gè)單例的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于swift中如何正確安全聲明一個(gè)單例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Swift中風(fēng)味各異的類型擦除實(shí)例詳解

    Swift中風(fēng)味各異的類型擦除實(shí)例詳解

    你也許曾聽過類型擦除,甚至也使用過標(biāo)準(zhǔn)庫提供的類型擦除類型如 AnySequence,下面這篇文章主要給大家介紹了關(guān)于Swift中風(fēng)味各異的類型擦除的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Swift中的可選項(xiàng)Optional解包方式實(shí)現(xiàn)原理

    Swift中的可選項(xiàng)Optional解包方式實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了Swift中的可選項(xiàng)Optional解包方式實(shí)現(xiàn)原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • swift4.2實(shí)現(xiàn)新聞首頁導(dǎo)航

    swift4.2實(shí)現(xiàn)新聞首頁導(dǎo)航

    這篇文章主要為大家詳細(xì)介紹了swift4.2實(shí)現(xiàn)新聞首頁導(dǎo)航,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Swift中的指針操作詳解

    Swift中的指針操作詳解

    從傳統(tǒng)的C代碼和與之無縫配合的Objective-C代碼遷移到Swift并非小工程,我們的代碼庫肯定會(huì)時(shí)不時(shí)出現(xiàn)一些和C協(xié)作的地方,如果想要繼續(xù)使用那些C API的話,了解一些基本的Swift指針操作和使用的知識(shí)會(huì)很有幫助。下面通過這篇文章一起來學(xué)習(xí)下吧。
    2017-01-01
  • LeetCode?題解?Swift?有效的完全平方數(shù)

    LeetCode?題解?Swift?有效的完全平方數(shù)

    這篇文章主要為大家介紹了LeetCode?題解?Swift?有效的完全平方數(shù)方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • swift如何利用系統(tǒng)庫將漢字轉(zhuǎn)換為拼音詳解

    swift如何利用系統(tǒng)庫將漢字轉(zhuǎn)換為拼音詳解

    將漢字轉(zhuǎn)換為拼音更利于我們大家開發(fā)搜索功能,所以這篇文章主要給大家介紹了關(guān)于swift如何利用系統(tǒng)庫將漢字轉(zhuǎn)換為拼音的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10

最新評(píng)論

合山市| 灵石县| 罗定市| 贞丰县| 乡宁县| 镇平县| 楚雄市| 新巴尔虎右旗| 丰县| 杭锦旗| 岫岩| 山西省| 精河县| 尖扎县| 天全县| 黎平县| 建始县| 温州市| 沙湾县| 鹤山市| 四平市| 邻水| 曲阜市| 肥乡县| 仁化县| 鞍山市| 凤庆县| 讷河市| 昌都县| 内丘县| 马关县| 昌乐县| 奎屯市| 磐安县| 元谋县| 定兴县| 垦利县| 元氏县| 乡城县| 江城| 商都县|