Swift正则expression式:一个string匹配模式?
在Swift中,查看一个string是否匹配模式的简单方法是什么?
伪代码示例:
if string matches pattern ... if string =~ pattern ...
(我已经阅读了Swift文档,并没有看到正则expression式的能力,我已经阅读了关于添加一个新的=~
运算符,这是一个好主意,但比我想要的更复杂,因为这是一个教学项目。尝试rangeOfString
但得到错误:'string'没有成员'rangeOfString'。我正在寻找一个Swift解决scheme,即不键入NSRegularExpression。我不需要做任何事情的匹配结果数据。
Swift版本3解决scheme:
if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ...
Swift版本2解决scheme:
if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ...
例子 – 这个string是否包含两个字母“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的更新。
为了得到你真正需要的语法,你可以很容易的定义一个新的运算符,它包含了桥接NSString
function:
infix operator =~ {} func =~(string:String, regex:String) -> Bool { return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil } "abcd" =~ "ab*cd" "abcd" =~ "abcde+"
上面提到的解决scheme不再适用于我,所以我在这里发布我的解决scheme(我用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}$") { //... }
这将返回一个string是否匹配模式
例如。 matchesPattern(text:“sd56Yz”,pattern:“[a-zA-Z0-9] +”)true
例如。 matchesPattern(text:“sd56 $ Yz”,pattern:“[a-zA-Z0-9] +”)false
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) }