Swift正则表达式:字符串匹配模式吗?

joe*_*son 30 regex string ios swift

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

伪代码示例:

if string matches pattern ...

if string =~ pattern ...
Run Code Online (Sandbox Code Playgroud)

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

joe*_*son 68

Swift版本3解决方案:

if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ...
Run Code Online (Sandbox Code Playgroud)

Swift版本2解决方案:

if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ...
Run Code Online (Sandbox Code Playgroud)

示例 - 此字符串是否包含两个字母"o"字符?

"hello world".rangeOfString("o.*o", options: .RegularExpressionSearch) != nil
Run Code Online (Sandbox Code Playgroud)

注意:如果您收到错误信息'String' does not have a member 'rangeOfString',然后才补充一点:import Foundation.这是因为Foundation提供了自动桥接到Swift String类的NSString方法.

import Foundation
Run Code Online (Sandbox Code Playgroud)

感谢Onno Eberhard为Swift 3更新.

  • 为什么不使用 regex.firstMatch(in: string, options: [], range: NSRange(location: 0, length: string.count)) != nil`?它在语义上不是比“range(of:options:range:locale:)”更清晰吗? (3认同)

Onn*_*ard 24

上面提到的解决方案对我不起作用,所以我在这里发布我的解决方案(我使用String的扩展名):

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

例:

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

  • 查看正则表达式的参考,示例和现场演示:http://regexr.com (2认同)

Dav*_*rry 12

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

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

"abcd" =~ "ab*cd"
"abcd" =~ "abcde+"
Run Code Online (Sandbox Code Playgroud)