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
正则表达式的使用方法、js正则表达式使用方法、正则表达式使用方法、swiftyjson使用方法、swift 正则表达式,以便于您获取更多的相关知识。

时间: 2024-10-28 20:55:06

Swift中使用正则表达式的一些方法_Swift的相关文章

swift中的正则表达式小结_正则表达式

作为一门先进的编程语言,Swift 可以说吸收了众多其他先进语言的优点,但是有一点却是让人略微失望的,就是 Swift 至今为止并没有在语言层面上支持正则表达式. 正则表达式的用处: 判断给定的字符串是否符合某一种规则(专门用于操作字符串) - 电话号码,电子邮箱,URL... - 可以直接百度别人写好的正则 - 别人真的写好了,而且测试过了,我们可以直接用 - 要写出没有漏洞正则判断,需要大量的测试,通常最终结果非常负责 过滤筛选字符串,网络爬虫 替换文字,QQ聊天,图文混排 语法规则 使用过

Swift中的可变参数函数介绍_Swift

可变参数函数指的是可以接受任意多个参数的函数,我们最熟悉的可能就是 NSString 的 -stringWithFormat:方法了.在 Objective-C 中,我们使用这个方法生成字符串的写法是这样的: 复制代码 代码如下: NSString *name = @"Tom"; NSDate *date = [NSDate date]; NSString *string = [NSString stringWithFormat:                 @"Hell

详解Swift中enum枚举类型的用法_Swift

一.引言 在Objective-C语言中,没有实际上是整型数据,Swift中的枚举则更加灵活,开发者可以不为其分配值类型把枚举作为独立的类型来使用,也可以为其分配值,可以是字符,字符串,整型或者浮点型数据. 二.枚举语法 Swift中enum关键字来进行枚举的创建,使用case来创建每一个枚举值,示例如下: //创建姓氏枚举,和Objective-C不同,Swift枚举不会默认分配值 enum Surname { case 张 case 王 case 李 case 赵 } //创建一个枚举类型的

浅谈在Swift中关于函数指针的实现_Swift

Swift没有什么? 苹果工程师给我建的唯一一堵墙是:在Swift中没有任何办法获得一个函数的指针:     注意,C函数指针不会导入到Swift中(来自"Using Swift with Cocoa and Objective-C") 但是我们怎么知道这种情况下钩子的地址和跳到哪呢?让我们深入了解一下,并且看看Swift的func在字节码层面上的是什么. 当你给一个函数传递一个泛型参数时,Swift并没有直接传递它的地址,而是一个指向trampoline函数(见下文)并带有一些函数元

在Java编程中使用正则表达式的基本方法_java

众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段.  大 家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.   自从jdk1

解析Swift中的泛型支持与使用_Swift

一.以泛型为参数的函数 泛型是Swift语言强大的核心,泛型是对类型的抽象,使用泛型开发者可以更加灵活方便的表达代码意图.我们知道,有参函数的参数必须有一个明确的参数类型,有些时候开发者会遇到这样一种情况,编写一个函数用于交换两个变量的值,由于变量有类型之分,实现相同的功能,可能需要重载成多个函数来实现,这大大浪费了开发成本,使用泛型,可以完美的解决这个问题,示例代码如下: func exchange<T>(inout param1:T,inout param2:T){ let tmp = p

python中使用正则表达式删除注释方法

关于多行匹配在python非贪婪.多行匹配正则表达式例子 一些regular的tips:  代码如下 复制代码 1 非贪婪flag >>> re.findall(r"a(d+?)", "a23b")         ['2'] >>> re.findall(r"a(d+)", "a23b")         ['23']注意比较这种情况: >>> re.findall(r&

javascript中的正则表达式使用指南

 这篇文章主要给大家介绍了Javascript中的正则表达式的使用方式,非常的详细,并附上简单示例,这里推荐给大家.     使用方式 1.创建表达式 JavaScript中创建正则表达式类的方法: var regex = new RegExp("d{5}") 或者 2.var regex = / d{5} /(推荐) /表达式/是JavaScript中专门为简化正则表达式编写而提供的语法,写在//中的正则表达式就不用管转义符了. RegExp对象的方法: 2.判断是否匹配 test(

手把手带你在 Swift 中应用代理(Delegate)

本文讲的是手把手带你在 Swift 中应用代理(Delegate), 什么是代理呢?在软件开发中,存在许多用于解决特定场景中的普遍问题的通用方案架构,这些所谓的"模板",常被称为设计模式. 代理就是一种设计模式,它允许某个对象在特定事件发生时,向另一个对象发送消息. 试想对象 A 调用对象 B 来执行某项操作.该操作完成后,对象 A 理应感知到对象 B 已经完成了任务以便采取后续的其它必要操作,而代理模式便能帮助我们完成这样的要求! 为了更好地理解这个概念,我将用 Swift 写一个简