麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Swift > 正文

Swift中使用正則表達式的一些方法

2020-03-09 17:50:10
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift中使用正則表達式的一些方法,Swift語言對正則表達式的支持也在不斷改進中,需要的朋友可以參考下
 

我使用Swift有段時間了,但最讓人郁悶的是它還不能支持正則表達式.

先要說的是,這確實是門新語言,我在網站上有注釋 a radar (rdar://17257306 for Apple folks). 如果你也認同這一觀點,請支持.

我所說的正則表達式指的是這種(Ruby代碼):
 

if name =~ /ski$/ puts "#{name} is probably polish"end

如果要快速查詢,可以使用=~操作符來返回匹配的結果.此外使用/pattern/syntax 形式來直接使用正則. 除了/符號需要轉義,其它符號都不受影響:

 url_pattern = /^https?:////.*/


這比使用//轉義要好得多 (這在正則里很常見). 如果正則里使用了字符串,那看起來會很糟糕.這是Objective-C代碼:
 

復制代碼代碼如下:
NSRegularExpression *regex = [NSRegularExpression
  regularExpressionWithPattern:@"//s+//w{4,10}//s//d+"
                       options:0
                         error:nil];

 

轉義每個/符號讓代碼可讀性變差.  更別提額外類的創建了. 當然,如果需要更強大的正則功能,那就得開發全套的特定實現類了.  但就一般情況來說 (在腳本語言里很常見) 有點小題大做.

Swift是怎么處理的?

Swift目前沒有提供支持正則的語法和類,所以只能使用之前提到的NSRegularExpression來實現.

但是我們可以考慮使用swift的超強操作符來實現. 考慮下面的場景:
 

復制代碼代碼如下:

class Regex {
  let internalExpression: NSRegularExpression
  let pattern: String
 
  init(_ pattern: String) {
    self.pattern = pattern
    var error: NSError?
    self.internalExpression = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error)
  }
 
  func test(input: String) -> Bool {
    let matches = self.internalExpression.matchesInString(input, options: nil, range:NSMakeRange(0, countElements(input)))
    return matches.count > 0
  }
}

 

這在使用NSRegularExpression時需要提供大量的假設驗證. 如果用另一種方法就簡單多了:

 

復制代碼代碼如下:

if Regex("//w{4}").test("ABCD") {
  println("matches pattern")
}

 

我們還是無可避免的得使用字符串轉義,但比使用原生的NSRegularExpression好多了.

=~ 操作符

研究了一下 Step Christopher 的方法后,我想自己改造一下操作符功能. 看起來挺簡單的:
 

復制代碼代碼如下:

operator infix =~ {}

 

這就定義了操作符的位置,就像操作兩個元素時不是放在它們之間,而是一個元素之前或之后(就像++操作). 下面定義一個使用該操作符的函數:

 

復制代碼代碼如下:

func =~ (input: String, pattern: String) -> Bool {
  return Regex(pattern).test(input)
}

 

復雜的部分是現成的,我們只需要簡單地調用.

最后,使用正則的測試結果如下:

 

復制代碼代碼如下:

let phoneNumber = "(800) 555-1111"
if phoneNumber =~ "(?//d{3})?//s//d{3}-//d{4}" {
  println("That looks like a valid US phone number")
}

 

我覺得這個結果很好,如果有天Apple發現了我的這個正則實現的語法/regex/literal syntax, 我很樂意提供支持.

更新

一個樂于助人的 Hacker News評論家  指出一個更接近我想要的方向,但使用現有的API:
 

復制代碼代碼如下:

if let match = name.rangeOfString("ski$", options: .RegularExpressionSearch) {
  println("/(name) is probably polish")
}

 

的確,我不知道這個,并且看起來非常有用。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲va国产va| 国产一级桃视频播放 | av在线免费电影 | 日韩在线播放第一页 | 操碰视频在线观看 | 国产精品视频六区 | 成熟女人特级毛片www免费 | 亚洲一级片免费观看 | 久草在线新时代视觉 | 国产做爰全免费的视频黑人 | 成人免费看视频 | 精品国产高清一区二区三区 | 视频一区二区三区在线播放 | 国产精品久久久在线观看 | 国产免费最爽的乱淫视频a 毛片国产 | 国外成人在线视频 | 国产成人在线观看网站 | 91网页| 99re热视频这里只精品 | 欧美视频不卡 | 中文字幕一区二区三区四区 | 俄罗斯hdxxx| 夜夜看 | 污污短视频 | 一级免费在线视频 | 激情小说色 | 亚洲国产二区 | 蜜桃视频在线播放 | 久久经典 | 九色中文字幕 | 黄片毛片一级 | 久久久成人精品 | 天天色人人爱 | 91九色视频观看 | 久久精品电影网 | 看片一区二区三区 | 久久久久久久久久综合 | 欧洲成人一区二区 | 国产成人综合在线 | 99久久精品免费 | 久久成人免费网 |