项目代码:
更多语法参考正则百科
NSDataDetector
- 系统自带的 正则表达式的子类,实现了一些常用的正则封装,比如:判断 url 很方便.
正则表达式常用符号含义:
一.单个字符匹配
-
[]
表示匹配其中任意一个字符,如:[abc123]
表示必须是abc123其中任意一个,又如:[a-z0-9]
匹配小写字母和数字。 -
[^]
表示匹配不是其中任意一个字符,如:[^abc123]
表示必须不是abc123其中任意一个,又如,[^a-z0-9]
表示必须不是小写字母和数字其中任意一个。 -
\d
表示匹配所有的数字 相当于[0-9] -
.
表示匹配除换行符号以外的任意字符 -
\w
表示匹配字母 或 数字 或 下划线 或 汉字 -
\s
表示匹配任意的空白符
二. 多个字符匹配
-
{n}
表示{}
前的字符(字符表达式)必须出现n
次, 如:[0-9][a-z]{3}
表示数字后面必须有3个字母,比如:1abc。 -
{n,m}
表示{}
前的字符(字符表达式)必须出现最少n
次最多m
次,如:[0-9][a-z]{3,6}
表示数字后面必须有3到6个字母。 -
{n,}
表示{}
前的字符(字符表达式)必须出现最少n
次, 如:[0-9][a-z]{3,}
表示数字后面至少3个字母。
-
*
表示*
前面的字符(字符表达式)可以重复出现0次或更多次,如:[a-z][0-9]*
表示字母后面可以有多个数字或者没有数字 -
+
表示+
前面的字符(字符表达式)可以重复出现1次或更多次 -
?
表示?
前面的字符(字符表达式)可以重复出现0次或1次
三.位置匹配表示
-
^
表示匹配必须以什么开始,如:^[a-z]
表示必须以小写字母开始。
-
$
表示匹配必须以什么结尾, 如:[123][asd]$
表示必须以asd其中任意一个字符结尾
二、正则匹配字符串位置的使用
- 1.siwft 方式
func myReg() {
//1. 待匹配的字符串
let rawStr = "abcaaaaabc"
//2. 正则匹配的样式
let pattern = "abc"
//3.创建正则表达式
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
print("创建正则表达式失败")
return
}
//4. 使用正则表达式匹配字符串
let resultArr = regex.matches(in: rawStr, options: [], range: NSRange(location: 0, length: (rawStr as NSString).length))
//4. 获取匹配出的结果
for result in resultArr {
let resultStr = (rawStr as NSString).substring(with: result.range)
print("匹配结果字符串:\(resultStr),匹配结果字符串范围: \(result.range)")
}
if resultArr.count == 0{
print("匹配失败")
}
}
- 2.oc 方式
@interface NSString (EmojiRegex)
/** 给定字符串和正则表达式,匹配出所有满足条件的字符串
返回值: 满足 正则表达式样式的 subString 的NSArray
参数:regPattern 正则表达式的样式
*/
-(NSArray<NSString *> *)subStringArrWithPattern:(NSString *)regPattern;
/** 给定字符串和正则表达式,匹配出所有满足条件的字符串的位置字符串
返回值: 满足 正则表达式样式的 subString 的NSRange
参数:regPattern 正则表达式的样式
*/
-(NSArray<NSString *> *)subStringRangeArrWithPattern:(NSString *)regPattern;
@end
@implementation NSString (EmojiRegex)
/** 给定字符串和正则表达式,匹配出所有满足条件的字符串
返回值: 满足 正则表达式样式的 subString 的NSArray
参数:regPattern 正则表达式的样式
*/
-(NSArray<NSString *> *)subStringArrWithPattern:(NSString *)regPattern{
NSArray *rangeStrArr = [self subStringRangeArrWithPattern:regPattern];;
NSMutableArray *patternStrArrM = [NSMutableArray array];
for (NSString *rangeStr in rangeStrArr) {
NSRange range = NSRangeFromString(rangeStr);
NSString *str = [self substringWithRange:range];
[patternStrArrM addObject:str];
}
return patternStrArrM;
}
/** 给定字符串和正则表达式,匹配出所有满足条件的字符串的位置字符串
返回值: 满足 正则表达式样式的 subString 的NSRange
参数:regPattern 正则表达式的样式
*/
-(NSArray<NSString *> *)subStringRangeArrWithPattern:(NSString *)regPattern{
NSError *err = nil;
NSRegularExpression *regExp = [[NSRegularExpression alloc]initWithPattern:regPattern options:kNilOptions error:&err];
if (err != nil) {
NSLog(@"创建正则表达式失败");
return nil;
}
NSArray<NSTextCheckingResult *> *resultArr= [regExp matchesInString:self options:kNilOptions range:NSMakeRange(0, self.length)];
NSMutableArray *rangeStrArrM = [NSMutableArray array];
for (NSTextCheckingResult *result in resultArr) {
NSRange range = [result range];
[rangeStrArrM addObject:NSStringFromRange(range)];
}
return rangeStrArrM;
}
@end
三、正则表达式实践
- 匹配 URL
// 匹配网址:
NSString *rawStr = @"点击参考网址:http://www.baidu.com 查看详情http://www.baidu.com2";
NSString *pattern = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?";
NSArray *subStrArr = [rawStr subStringArrWithPattern:pattern];
if (subStrArr.count > 0) {
NSLog(@"匹配结果如下:");
for (NSString *subStr in subStrArr) {
NSLog(@"%@",subStr);
}
}
else{
NSLog(@"-------匹配 失败了--------");
}
结果:
http://www.baidu.com
http://www.baidu.com2
- 匹配出
开始是某个确定的字符
结尾是某个确定字符
中间是具体的某种表达式(中间不能有开始和结尾的字符),
比如,以#开始 以#结尾 中间是URL网址
NSString *rawStr = @"点击参考网址:#http://www.baidu.com#查看详情#http://www.baidu.com2# #http://www.baidu.com#";
NSString *pattern = @"#http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?#";
NSArray *subStrArr = [rawStr subStringArrWithPattern:pattern];
if (subStrArr.count > 0) {
NSLog(@"匹配结果如下:");
for (NSString *subStr in subStrArr) {
NSLog(@"%@",subStr);
}
}
else{
NSLog(@"-------匹配 失败了--------");
}
结果:
#http://www.baidu.com#
#http://www.baidu.com2#
#http://www.baidu.com#
- 匹配表情
分析,表情一般都是 以[
开始 中间是文字 后面是]
结尾
/** 表情 [吃惊] [好爱哦]
*/
NSString *rawStr = @"@zhangsan:【成都新闻】 #春熙路#宁夏街[偷笑],@张老五:老西门,城东们[吃惊]@西门吹雪:皮读取#碧波园#白桥[好爱哦]~~~http://baidu.com.news";
NSString *pattern = @"\\[.*?\\]";
NSArray *subStrArr = [rawStr subStringArrWithPattern:pattern];
if (subStrArr.count > 0) {
NSLog(@"匹配结果如下:");
for (NSString *subStr in subStrArr) {
NSLog(@"%@",subStr);
}
}
else{
NSLog(@"-------匹配 失败了--------");
}
结果:
[偷笑]
[吃惊]
[好爱哦]
- 匹配表情位置
分析,表情一般都是 以[
开始 中间是文字 后面是]
结尾
/** 表情 [吃惊] [好爱哦]
*/
NSString *rawStr = @"@zhangsan:【成都新闻】 #春熙路#宁夏街[偷笑],@张老五:老西门,城东们[吃惊]@西门吹雪:皮读取#碧波园#白桥[好爱哦]~~~http://baidu.com.news";
NSString *pattern = @"\\[.*?\\]";
NSArray *rangArr = [rawStr subStringRangeArrWithPattern:pattern];
if (rangArr.count > 0) {
for (NSString *rangStr in rangArr) {
NSLog(@"rangStr:%@",rangStr);
}
}
else{
NSLog(@"---rangArr----匹配 失败了--------");
}
结果:
rangStr:{25, 4}
rangStr:{42, 4}
rangStr:{62, 5}
网友评论