Swift中的正则表达式?

13

我正在学习Swift,有一个问题,Swift中是否有正则表达式,如果有,如何使用?

在我的研究中,我发现了一些相互矛盾的信息。 苹果开发者文档提到了正则表达式,但它看起来与我见过的任何其他语言都不一样。如果这是解决方案,那么我该如何使用它?

另一方面 ,该网站建议Swift中不存在正则表达式。这是正确的吗?

如果有帮助的话,我试图使用正则表达式从JSON格式的API中获取比特币的平均价格,但它还包含很多我不想要的内容。

对于再次问出基础问题,我感到抱歉。


API的名称是什么? - Jan Moritz
Swift 目前对正则表达式的支持非常笨拙。它仍然基于 Objective-C 时代遗留下来的 NSRegularExpression 类。你不会找到像 Python 或者甚至 C# 那样方便的工具。我认为苹果需要重新设计更易用的正则表达式类。 - Code Different
4个回答

31

很遗憾,Swift没有正则表达式字面量。但是你提到的外部链接介绍了两种使用正则表达式的方法:

  1. 创建一个NSRegularExpression的类包装器并使用此类。
  2. 在Swift中调用Foundation方法rangeOfString:options: 并将选项设置为RegularExpressionSearch

第二种方法更加简洁易懂,实现起来也更加简单。

在Swift中,该方法定义如下:

func rangeOfString(_ aString: String!,options mask: NSStringCompareOptions) -> NSRange

您可以将其与正则表达式匹配一起使用:

let myStringToBeMatched = "ThisIsMyString"
let myRegex = "ing$"
if let match = myStringToBeMatched.rangeOfString(myRegex, options: .RegularExpressionSearch){
    println("\(myStringToBeMatched) is matching!")
}

这里是苹果公司有关 rangeOfString() 的文档。


3
现今,显然需要使用 match = myStringToBeMatched.range(of: myRegex, options: .regularExpression) 进行字符串匹配。 - Raphael

4

我也遇到了同样的问题。所以,我写了一个小封装 - https://gist.github.com/ningsuhen/dc6e589be7f5a41e7794。将 Regex.swift 文件添加到您的项目中,并添加“Foundation”框架(如果尚未添加)。完成后,您可以按照以下方式使用替换和匹配方法。

"+91-999-929-5395".replace("[-\\s\\(\\)]", template: "") //replace with empty or remove
"+91-999-929-5395".match("[-\\s\\(\\)]") //simple match - returns only true or false, not the matched patterns.

1
另一个简单的选择是使用NSPredicate,如果您感兴趣的是纯验证(真/假):
这是一个快速匹配加拿大邮政编码的正则表达式:
func isCAZipValid(_ zip: String) -> Bool {
    return NSPredicate(format: "SELF MATCHES %@", "^([A-Z]\\d[A-Z])(\\s|-)?(\\d[A-Z]\\d)$")
             .evaluate(with: zip.uppercased())                
}

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接