在Swift中,查看字符串是否与模式匹配的简单方法是什么?
伪代码示例:
if string matches pattern ...
if string =~ pattern ...
(我已经阅读过Swift文档并且还没有看到正则表达式的功能。我已经阅读了有关添加新=~
运算符的内容,这是一个好主意但比我想要的更复杂,因为这是为了一个教学项目。我试过rangeOfString
但得到错误:'String'没有成员'rangeOfString'。我正在寻找一个Swift解决方案,即不输入NSRegularExpression。我不需要做任何事情匹配结果数据。)
答案 0 :(得分:62)
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的更新。
答案 1 :(得分:20)
上面提到的解决方案对我不起作用,所以我在这里发布我的解决方案(我使用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}$") {
//...
}
答案 2 :(得分:12)
要获得您实际询问的语法,您可以轻松定义一个包含桥接NSString
功能的新运算符:
infix operator =~ {}
func =~(string:String, regex:String) -> Bool {
return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil
}
"abcd" =~ "ab*cd"
"abcd" =~ "abcde+"
答案 3 :(得分:-1)
在 Swift 4.2 中,即使字符串与模式不匹配,以下内容也不返回nil:
uxStudentFormActive_ItemDataBound
如Xcode所建议:
比较类型'NSRange'(也称为'_NSRange')的非可选值和nil 总是返回true
因此,我最终使用的是:
string.range(of: regex, options: .regularExpression, range: nil, locale: nil)
答案 4 :(得分:-2)
这将返回字符串是否与模式匹配
例如。 matchesPattern(text:“sd56Yz”,pattern:“[a-zA-Z0-9] +”)true
例如。 matchesPattern(text:“sd56 $ Yz”,pattern:“[a-zA-Z0-9] +”)false
top: 0;