Swift中使用正則表達(dá)式的一些方法
我使用Swift有段時(shí)間了,但最讓人郁悶的是它還不能支持正則表達(dá)式.
先要說的是,這確實(shí)是門新語(yǔ)言,我在網(wǎng)站上有注釋 a radar (rdar://17257306 for Apple folks). 如果你也認(rèn)同這一觀點(diǎn),請(qǐng)支持.
我所說的正則表達(dá)式指的是這種(Ruby代碼):
if name =~ /ski$/
puts "#{name} is probably polish"
end
如果要快速查詢,可以使用=~操作符來返回匹配的結(jié)果.此外使用/pattern/syntax 形式來直接使用正則. 除了/符號(hào)需要轉(zhuǎn)義,其它符號(hào)都不受影響:
url_pattern = /^https?:\/\/.*/
這比使用\\轉(zhuǎn)義要好得多 (這在正則里很常見). 如果正則里使用了字符串,那看起來會(huì)很糟糕.這是Objective-C代碼:
regularExpressionWithPattern:@"\\s+\\w{4,10}\\s\\d+"
options:0
error:nil];
轉(zhuǎn)義每個(gè)\符號(hào)讓代碼可讀性變差. 更別提額外類的創(chuàng)建了. 當(dāng)然,如果需要更強(qiáng)大的正則功能,那就得開發(fā)全套的特定實(shí)現(xiàn)類了. 但就一般情況來說 (在腳本語(yǔ)言里很常見) 有點(diǎn)小題大做.
Swift是怎么處理的?
Swift目前沒有提供支持正則的語(yǔ)法和類,所以只能使用之前提到的NSRegularExpression來實(shí)現(xiàn).
但是我們可以考慮使用swift的超強(qiáng)操作符來實(shí)現(xiàn). 考慮下面的場(chǎng)景:
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時(shí)需要提供大量的假設(shè)驗(yàn)證. 如果用另一種方法就簡(jiǎn)單多了:
if Regex("\\w{4}").test("ABCD") {
println("matches pattern")
}
我們還是無可避免的得使用字符串轉(zhuǎn)義,但比使用原生的NSRegularExpression好多了.
=~ 操作符
研究了一下 Step Christopher 的方法后,我想自己改造一下操作符功能. 看起來挺簡(jiǎn)單的:
operator infix =~ {}
這就定義了操作符的位置,就像操作兩個(gè)元素時(shí)不是放在它們之間,而是一個(gè)元素之前或之后(就像++操作). 下面定義一個(gè)使用該操作符的函數(shù):
func =~ (input: String, pattern: String) -> Bool {
return Regex(pattern).test(input)
}
復(fù)雜的部分是現(xiàn)成的,我們只需要簡(jiǎn)單地調(diào)用.
最后,使用正則的測(cè)試結(jié)果如下:
let phoneNumber = "(800) 555-1111"
if phoneNumber =~ "(?\\d{3})?\\s\\d{3}-\\d{4}" {
println("That looks like a valid US phone number")
}
我覺得這個(gè)結(jié)果很好,如果有天Apple發(fā)現(xiàn)了我的這個(gè)正則實(shí)現(xiàn)的語(yǔ)法/regex/literal syntax, 我很樂意提供支持.
更新
一個(gè)樂于助人的 Hacker News評(píng)論家 指出一個(gè)更接近我想要的方向,但使用現(xiàn)有的API:
if let match = name.rangeOfString("ski$", options: .RegularExpressionSearch) {
println("\(name) is probably polish")
}
的確,我不知道這個(gè),并且看起來非常有用。
相關(guān)文章
Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法示例
最近學(xué)完了swift想著實(shí)踐下,就通過一些簡(jiǎn)單的算法進(jìn)行學(xué)習(xí)研究,下面這篇文章主要介紹了Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
openstack重啟swift服務(wù)后報(bào)錯(cuò)問題解決方案
這篇文章主要介紹了解決openstack重啟swift服務(wù)后報(bào)錯(cuò),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
蘋果公司編程語(yǔ)言Swift語(yǔ)言簡(jiǎn)介
這篇文章主要介紹了蘋果公司編程語(yǔ)言Swift語(yǔ)言簡(jiǎn)介,Swift 是一門新的編程語(yǔ)言,兼容Objective-C代碼,是用來代替Objective-C的蘋果主力開發(fā)語(yǔ)言,需要的朋友可以參考下2014-07-07
通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼
這篇文章主要給大家介紹了通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
淺談Swift編程中switch與fallthrough語(yǔ)句的使用
這篇文章主要介紹了Swift編程中switch與fallthrough語(yǔ)句的使用,用于基本的流程控制,需要的朋友可以參考下2015-11-11
Swift4使用GCD實(shí)現(xiàn)計(jì)時(shí)器
這篇文章主要為大家詳細(xì)介紹了Swift4使用GCD實(shí)現(xiàn)計(jì)時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

