2015-04-21 276 views
18

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

伪代码示例:

if string matches pattern ... 

if string =~ pattern ... 

(我已阅读斯威夫特文档并没有看到一个正则表达式的能力,我读过有关添加新=~运营商这是一个好主意,但比我更复杂因为这是一个教学项目,我试过rangeOfString,但得到的错误:'字符串'没有'rangeOfString'成员我正在寻找一个Swift解决方案,即不打字NSRegularExpression。我不需要对匹配结果数据做任何事情。)

+0

可能重复http://stackoverflow.com/questions/28776945/swift-regex-matching) – picciano

+0

@picciano感谢您的链接 - 我补充说明这个问题不同于链接的问题,因为我只想使用Swift术语,而不是NSRegularExpression。 – joelparkerhenderson

回答

39

Swift版本3解决方案:

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

斯威夫特版本2的解决方案:

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

实例 - 这是否字符串包含两个字母 “O” 字?

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

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

import Foundation 

感谢Onno Eberhard对Swift 3的更新。

10

为了让你真正问的语法,你可以很容易地定义一个新的运营商,它封装桥接NSString功能:

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

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

谢谢大卫。对于这个特定的项目,我正在寻找一种不定义新操作员的解决方案。 (如果Swift将您的想法添加到整个语言,恕我直言,这将是非常好的,恕我直言) – joelparkerhenderson

9

上面提到的,我没有工作了的解决方案,所以我张贴在这里我的解决方案(我用于字符串的扩展名):

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}$") { 
    //... 
} 
+2

查看参考资料,正则表达式的示例和现场演示:http://regexr.com – naeemjawaid

0

这将返回字符串是否匹配模式

例如。 matchesPattern(text:“sd56Yz”,pattern:“[a-zA-Z0-9] +”)true

eg。 matchesPattern(文字: “sd56 $ YZ” 模式: “[A-ZA-Z0-9] +”)假

func matchesPattern(text: String?, pattern: String?) -> Bool { 
    guard hasValue(text) && hasValue(pattern) else { 
     return false 
    } 

    let range = text!.rangeOfString(pattern!, options: .RegularExpressionSearch) 

    guard range != nil else { 
     return false 
    } 

    let rangeString = text?.substringWithRange(range!) 

    return areEqual(text, string2: rangeString) 
} 
[斯威夫特正则表达式匹配(的
相关问题