程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift中應用正則表達式的一些辦法

Swift中應用正則表達式的一些辦法

編輯:更多關於編程

Swift中應用正則表達式的一些辦法。本站提示廣大學習愛好者:(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")
}

切實其實,我不曉得這個,而且看起來異常有效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved