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

 更新时间:2015年07月16日 11:02:10   投稿:goldensun  
这篇文章主要介绍了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")
}

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

相关文章

  • swift 4自定义UITableCell的方法示例

    swift 4自定义UITableCell的方法示例

    这篇文章主要给大家介绍了关于swift 4自定义UITableCell的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • swift 3.0 正则表达式查找/替换字符的实现代码

    swift 3.0 正则表达式查找/替换字符的实现代码

    正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。本文重点给大家介绍swift 3.0 正则表达式查找/替换字符的实现代码,需要的朋友参考下吧
    2017-08-08
  • Swift操作Quartz 2D进行简单的绘图与坐标变换的教程

    Swift操作Quartz 2D进行简单的绘图与坐标变换的教程

    这篇文章主要介绍了Swift操作Quartz 2D进行简单的绘图与坐标变换的教程,Quartz 2D是Core Graphics框架中的一个重要组件,经常被Mac OS或和iOS开发者用来绘图,需要的朋友可以参考下
    2016-04-04
  • Swift继承Inheritance浅析介绍

    Swift继承Inheritance浅析介绍

    继承我们可以理解为一个类获取了另外一个类的方法和属性。当一个类继承其它类时,继承类叫子类,被继承类叫超类(或父类),在Swift中,类可以调用和访问超类的方法,属性和下标脚本,并且可以重写它们。我们也可以为类中继承来的属性添加属性观察器
    2022-08-08
  • Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍

    Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍

    这篇文章主要介绍了Objective-c代码如何移植为Swift代码,Objective-c代码转移到Swift过程介绍,需要的朋友可以参考下
    2014-07-07
  • Swift5中从原始文本创建字符串的方法

    Swift5中从原始文本创建字符串的方法

    这篇文章主要给大家介绍了关于Swift5中从原始文本创建字符串的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Swift5具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Swift语言中字符串相关的基本概念解析

    Swift语言中字符串相关的基本概念解析

    这篇文章主要介绍了Swift语言中字符串相关的基本概念解析,是Swift入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • Swift学习教程之访问控制详解

    Swift学习教程之访问控制详解

    访问控制可以限定你在源文件或模块中访问代码的级别,也就是说可以控制哪些代码你可以访问,哪些代码你不能访问。下面这篇文章主要给大家介绍了关于Swift学习教程之访问控制的相关资料,需要的朋友可以参考下。
    2017-08-08
  • 用SwiftUI实现3D Scroll滚动效果的实现代码

    用SwiftUI实现3D Scroll滚动效果的实现代码

    这篇文章主要介绍了用SwiftUI实现3D Scroll效果的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习
    2020-04-04
  • Swift使用CoreData时遇到的一些填坑记录

    Swift使用CoreData时遇到的一些填坑记录

    这篇文章主要给大家记录了在Swift使用CoreData时遇到的一些坑,以及介绍了CoreData在Swift 3.0中的一点改变,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-12-12

最新评论