有些人说: 遇到问题,明白了。我要用 NSRegularExpression: 正则表达式, 现在有三个问题
编程世界里, 正则表达式应用广泛。 有些觉得这个十分难以理解, 符号密集。 更多的程序员觉得,正则表达式是代码的基础 ,是一个笑话。
有些程序员觉得,正则表达式,真是轻便,有强大。没有工具库这样通用的神器的人,不知道他们怎么工作的。
首先,我们都认为,Cocoa 在NSRegularExpression中,封装了你不曾见识过的 强大的正则表达式。
不行吗?我们从这个HTML片段中提取链接,先用Ruby
htmlSource = "Questions? Corrections? [@NSHipster](http://www.jianshu.com/%22https://twitter.com/NSHipster/%22) or [on GitHub](http://www.jianshu.com/%22https://github.com/NSHipster/articles/%22)." linkRegex = /]*href="([^"]*)"[^>]*>/ilinks = htmlSource.scan(linkRegex)puts(links)# https://twitter.com/NSHipster# https://github.com/NSHipster/articles
两三行程序,看你怎么数了。还行吧,现在试试在Swift 中使用 NSRegularExpression 提取链接
let htmlSource="Questions? Corrections? [@NSHipster](http://www.jianshu.com/%22https://twitter.com/NSHipster/%22) or [on GitHub](http://www.jianshu.com/%22https://github.com/NSHipster/articles/%22)."let linkRegexPattern = "]*href=\"([^\"]*)\"[^>]*>"let linkRegex = try! NSRegularExpression(pattern: linkRegexPattern , options:.caseInsensitive) let matches = linkRegex.matches(in:htmlSource,range:NSMakeRange(0,htmlSource.utf16.count))let links = matches.map{result->Stringinglet hrefRange = result.rangeAt(1)let start = String.UTF16Index(hrefRange.location)let end = String.UTF16Index(hrefRange.location+hrefRange.length)return String(htmlSource.utf16[start..String? { guard let range = nsrange.toRange() else { return nil } let start = UTF16Index(range.lowerBound) let end = UTF16Index(range.upperBound) return String(utf16[start..Range? { guard let range = nsrange.toRange() else { return nil } let utf16Start = UTF16Index(range.lowerBound) let utf16End = UTF16Index(range.upperBound) guard let start = Index(utf16Start, within: self), let end = Index(utf16End, within: self) else { return nil } return start..
1 NSTextCheckingResult的实例 ? ,
2 这些代码, 我都没码一下的 >
3 [四种不同的编码方式](https://developer.apple.com/swift/blog/?id=30) ///
4 返回与 给定范围相同的范围
// 如果该范围,转换失败,返回nil func range(from nsrange: NSRange) -> Range? {
参考资料: