2KB项目,专业的源码交易网站 帮助 收藏 每日签到

Swift 的正则表达式

  • 时间:2019-01-23 18:35 编辑:2KB 来源:2KB.COM 阅读:264
  • 扫一扫,手机访问
  • 分享
摘要:
Swift 英文原文:Regex in 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}sd+"
                       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})?sd{3}-d{4}" {
  println("That looks like a valid US phone number")
}

我觉得这个结果很好,如果有天Apple发现了我的这个正则实现的语法/regex/literal syntax, 我很乐意提供支持.

其它翻译版本 (1) 加载中

更新

一个乐于助人的 Hacker News评论家  指出一个更接近我想要的方向,但使用现有的API:

if let match = name.rangeOfString("ski$", options: .RegularExpressionSearch) {
  println("(name) is probably polish")
}

的确,我不知道这个,并且看起来非常有用。

其它翻译版本 (1) 加载中 本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部