源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Swift中使用正则表达式的一些方法

  • 时间:2022-07-13 17:39 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要: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代码:  
[u]复制代码[/u] 代码如下:
NSRegularExpression *regex = [NSRegularExpression   regularExpressionWithPattern:@"\\s+\\w{4,10}\\s\\d+"                        options:0                          error:nil];
转义每个\符号让代码可读性变差.  更别提额外类的创建了. 当然,如果需要更强大的正则功能,那就得开发全套的特定实现类了.  但就一般情况来说 (在脚本语言里很常见) 有点小题大做. [b]Swift是怎么处理的?[/b] Swift目前没有提供支持正则的语法和类,所以只能使用之前提到的NSRegularExpression来实现. 但是我们可以考虑使用swift的超强操作符来实现. 考虑下面的场景:  
[u]复制代码[/u] 代码如下:
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时需要提供大量的假设验证. 如果用另一种方法就简单多了:  
[u]复制代码[/u] 代码如下:
if Regex("\\w{4}").test("ABCD") {   println("matches pattern") }
我们还是无可避免的得使用字符串转义,但比使用原生的NSRegularExpression好多了. [b]=~ 操作符[/b] 研究了一下 Step Christopher 的方法后,我想自己改造一下操作符功能. 看起来挺简单的:  
[u]复制代码[/u] 代码如下:
operator infix =~ {}
这就定义了操作符的位置,就像操作两个元素时不是放在它们之间,而是一个元素之前或之后(就像++操作). 下面定义一个使用该操作符的函数:  
[u]复制代码[/u] 代码如下:
func =~ (input: String, pattern: String) -> Bool {   return Regex(pattern).test(input) }
复杂的部分是现成的,我们只需要简单地调用. 最后,使用正则的测试结果如下:  
[u]复制代码[/u] 代码如下:
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, 我很乐意提供支持. [b]更新[/b] 一个乐于助人的 Hacker News评论家  指出一个更接近我想要的方向,但使用现有的API:  
[u]复制代码[/u] 代码如下:
if let match = name.rangeOfString("ski$", options: .RegularExpressionSearch) {   println("\(name) is probably polish") }
的确,我不知道这个,并且看起来非常有用。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部