【问题标题】:Swift regex: does a string match a pattern?Swift 正则表达式:字符串是否与模式匹配?
【发布时间】:2015-06-29 08:04:48
【问题描述】:

在 Swift 中,查看字符串是否匹配模式的简单方法是什么?

伪代码示例:

if string matches pattern ...

if string =~ pattern ...

(我已经阅读了 Swift 文档,但没有看到正则表达式功能。我已经阅读了有关添加新的 =~ 运算符的信息,这是一个好主意,但比我想要的要复杂,因为这是为了教学项目。我尝试过rangeOfString,但得到错误:'String' 没有成员'rangeOfString'。我正在寻找一个 Swift 解决方案,即不输入 NSRegularExpression。我不需要对匹配结果数据做任何事情.)

【问题讨论】:

  • Swift Regex Matching的可能重复
  • @picciano 感谢您的链接 - 我添加了一个说明,说明这个问题与链接的问题不同,因为我只想使用 Swift 术语,而不是 NSRegularExpression。

标签: ios regex string swift


【解决方案1】:

Swift 版本 3 解决方案:

if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ...

Swift 版本 2 解决方案:

if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ...

示例 -- 该字符串是否包含两个字母“o”字符?

"hello world".rangeOfString("o.*o", options: .RegularExpressionSearch) != nil

注意:如果您收到错误消息'String' does not have a member 'rangeOfString',请在前面添加:import Foundation。这是因为 Foundation 提供了自动桥接到 Swift String 类的 NSString 方法。

import Foundation

感谢 Onno Eberhard 对 Swift 3 的更新。

【讨论】:

  • 为什么不使用regex.firstMatch(in: string, options: [], range: NSRange(location: 0, length: string.count)) != nil?是不是比range(of:options:range:locale:)语义更清晰。
【解决方案2】:

上面提到的解决方案不再适合我,所以我在这里发布我的解决方案(我使用了 String 的扩展):

extension String {
    func matches(_ regex: String) -> Bool {
        return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil
    }
}

例子:

if str.matches("^[a-zA-Z0-9._-]{1,30}$") {
    //...
}

【讨论】:

  • 查看正则表达式的参考、示例和现场演示:regexr.com
  • 您节省了我的 4 个小时。可重复使用的方法非常有用。
【解决方案3】:

要获得您实际询问的语法,您可以轻松定义一个新的运算符来包装桥接的NSString 功能:

infix operator =~ {}
func =~(string:String, regex:String) -> Bool {
    return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil
}

"abcd" =~ "ab*cd"
"abcd" =~ "abcde+"

【讨论】:

  • 谢谢大卫。对于这个特定的项目,我正在寻找一个不定义新运算符的解决方案。 (如果 Swift 将您的想法添加到整个语言中,那就太好了,恕我直言)
【解决方案4】:

Swift 4.2 中,即使字符串与模式不匹配,以下内容也不会返回 nil:

string.range(of: regex, options: .regularExpression, range: nil, locale: nil)

正如 Xcode 建议的那样:

将“NSRange”(又名“_NSRange”)类型的非可选值与 nil 进行比较 总是返回 true

因此我最终使用的是:

if string.range(of: regex, options: .regularExpression)
        .location != NSNotFound {
    // do stuff if string matches regexp
}

【讨论】:

  • 您在NSString 上调用该方法,而不是在String 上,这是您的问题。您的解决方案在技术上对 NSString 是正确的,但您也可以只做 (string as String).range(of: ...) != nil
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多