iOS - regex 正则表达式简述
2016-02-05 本文已影响640人
cyh老崔
正则表达式的使用时机:
- 从一组字符串中, 判断是否含有某组(个)特定的字符串.如:
- 判断某字符串是否含有某组字符串:电话号码/邮箱/QQ号码,等等
- 判断某字符串是否含有某个字符:"[", "%", "$", 等等
正则表达式的使用方法:
-
正则表达式的使用只有3步:
-
1.编写正则表达式规则
-
2.根据规则创建正则表达式对象
-
3.根据对象匹配数据
-
而各种常见的规则在网上已被各路大神写好,95%的coder只要复制就可以了, I am included.
-
下面是一个"简单"的示例方法,匹配邮箱
private func validateEmail(str: String) -> Bool {
// 1.编写邮箱规则(来自Internet)
let pattern = "^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$"
// 2.根据规则创建正则表达式对象
guard let regex = try? NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions(rawValue: 0)) else {
return false
}
// 3.根据对象匹配数据
// range: 检验传入字符串str的哪些部分,此处为全部
let result: Int = regex.numberOfMatchesInString(str,
options: NSMatchingOptions(rawValue: 0),
range: NSMakeRange(0, str.characters.count))
return result > 0
}
Xcode提供下面几个操作正则表达式的方法:
- 返回匹配规则的字符串的个数
public func numberOfMatchesInString(string: String, options: NSMatchingOptions, range: NSRange) -> Int
- 返回第一个匹配规则的子串的范围
public func rangeOfFirstMatchInString(string: String, options: NSMatchingOptions, range: NSRange) -> NSRange
- 返回第一个匹配规则的子串的结果集(包含范围)
public func firstMatchInString(string: String, options: NSMatchingOptions, range: NSRange) -> NSTextCheckingResult?
- 返回所有匹配规则的子串的结果集数组
public func matchesInString(string: String, options: NSMatchingOptions, range: NSRange) -> [NSTextCheckingResult]
//示例
//根据正则表达式对象取得结果.
let array = regex.matchesInString(str,
options: NSMatchingOptions(rawValue: 0),
range: NSMakeRange(0,
str.characters.count))
//遍历结果NSRange数组,取出结果
for result in array {
let temp = (str as! NSString).substringWithRange(result.range)
print(temp)
}
如果有多个规则, 使用 "|" 连接
//1 编写正则表达式规则
//1.1 pattern1: 得到此形式文本:[n个文本].
//1.2 \w:匹配字母或数字或下划线或汉字 [a-zA-Z_0-9] 常用
//1.3 +: 重复一次或更多次
let pattern1 = "\\[\\w+\\]"
let pattern2 = "@\\w+:"
let pattern3 = "#\\w+#"
let pattern4 = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?"
// 多个规则可以使用 | 来连接
let pattern = pattern1 + "|" + pattern2 + "|" + pattern3 + "|" + pattern4
此外,苹果自带的探测器集成了很多正则表达式.如取出网址
let str = "@FanLu:快看网址~ http://www.jianshu.com/collection/9e553f618413 ,一起探讨文章."
//2.写正则对象,根据规则
guard let detechtor =
try? NSDataDetector(types: NSTextCheckingType.Link.rawValue) else {
return
}
//3.取得结果,根据对象.生成的是数组
let array = detechtor.matchesInString(str,
options: NSMatchingOptions(rawValue: 0),
range: NSMakeRange(0, str.characters.count))
//遍历数组,取出结果
for result in array {
let temp = (str as! NSString).substringWithRange(result.range)
print(temp)
}
声明: 任何博文不可尽信,智者千虑,必有一失.何况世上有多少智者?
- 欢迎探讨,欢迎拍砖.不过这篇好像没什么深度可拍的.