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")
}
切實其實,我不曉得這個,而且看起來異常有效。