".": 几乎表示所有字符串
"*”:表示没有或更多;
"+":表示一次或更多;
“ab*”:表示一个字符串有一个a后面跟着零个或若干个b(”a”, “ab”, “abbb”,……);
“ab+”:表示一个字符串有一个a后面跟着至少一个b或者更多( ”ab”, “abbb”,……);
“[ab]“:表示一个字符串有一个”a”或”b”(相当于”a|b”);
“[a-d]“:表示一个字符串包含小写的'a'到'd'中的一个(相当于”a|b|c|d”或者”[abcd]“);
“ \d ”:匹配一个数字字符。等价于[0-9]。
“ab{4}”:表示一个字符串有一个a跟着4个b(”abbbb”);
“ab{1,}”:表示一个字符串有一个a跟着至少1个b(”ab”,”abb”,”abbb”,……);
“ab{3,4}”:表示一个字符串有一个a跟着3到4个b(”abbb”,”abbbb”)。
那么,“*”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示
“^one”:表示所有以”one”开始的字符串(”one cat”,”one123″,·····);
“a dog$”:表示所以以”a dog”结尾的字符串(”it is a dog”,·····);
“banana”:表示任何包含”banana”的字符串。
“^apple$”:表示开始和结尾都是”apple”的字符串,这个是唯一的~;
1、NSPredicate
NSString *str = @"a";
NSString* number=@"ab*";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
BOOL match = [numberPre evaluateWithObject:str];
if (match) {
NSLog(@"匹配");
}else{
NSLog(@"不匹配");
}
注意:谓词与正则表达式连用,只有字符串所有位数匹配才会返回ture
eg:
NSString *str = @"two rttt";
NSString* number=@"^two";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
BOOL match = [numberPre evaluateWithObject:str];
NSLog(@"不匹配");
NSString *str = @"two dog";
NSString* number=@"dog$";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
BOOL match = [numberPre evaluateWithObject:str];
NSLog(@"不匹配");
NSString *str = @"two dog";
NSString* number=@"dog";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
BOOL match = [numberPre evaluateWithObject:str];
NSLog(@"不匹配");
虽说 ^two 表示的是以two开头的字符串,但是这里的^two正则表达式只能说明要匹配的字符串是3位。所以使用谓词来判断是否匹配字符串,首先看字符串位数匹配不,位数都不匹配肯定就不匹配了。其它dog$、dog同理是位数不匹配。
NSString *str = @"two dog";
NSString* number=@"two.*dog$";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
BOOL match = [numberPre evaluateWithObject:str];
NSLog(@"匹配");
"two.dog$" 这里的"."表示任意字符串,""表示重复0次或更多。首先正则表达式位数是模糊的,但肯定是匹配str位数的。然后都是dog结尾,因此整个就匹配了。
2、NSRegularExpression
NSString *searchText = @"你很世界,</div>标题1</div>";
NSString *rules = @"</div>.*?</div>";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:rules options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@", [searchText substringWithRange:result.range]);
}
输出:</div>标题1</div>
- 贪婪匹配:尽可能匹配最长的字符串
NSString *searchText = @"你很世界,</div>标题1</div></div>标题1</div>";
NSString *rules = @"</div>.*</div>";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:rules options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@", [searchText substringWithRange:result.range]);
}
输出:</div>标题1</div></div>标题1</div>
- 非贪婪匹配: 尽可能匹配最短的字符串
默认情况下匹配都是贪婪模式,如果要改成非贪婪模式,只需要量词后面加上一个问号?。非贪婪模式在第一次匹配成功后就会停止匹配。
1、查找一个div标签
NSString *searchText = @"你很世界,</div>标题1</div></div>标题1</div>";
NSString *rules = @"</div>.*?</div>";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:rules options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@", [searchText substringWithRange:result.range]);
}
输出:</div>标题1</div>
2、查找所有的div标签
NSString *testString1 = @"你很世界,</div>aaaaa</div>eerrrrrrr</div>bbbbbbb</div>";
NSError *error;
NSString* regexString = @"</div>.*?</div>";
//创建一个正则表达式对象,存储匹配规则
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:0 error:&error];
if (regex != nil) {
//用该方法解析出所有
NSArray* array = [regex matchesInString:testString1 options:NSMatchingReportProgress range:NSMakeRange(0, [testString1 length])];
NSMutableArray* stringArray = [[NSMutableArray alloc] init];
//当解析出的数组至少有一个对象时,即原文本中存在至少一个符合规则的字段
if (array.count != 0) {
for (NSTextCheckingResult* result in array) {
//从NSTextCheckingResult类中取出range属性
NSRange range = result.range;
//从原文本中将字段取出并存入一个NSMutableArray中
[stringArray addObject:[testString1 substringWithRange:range]];
}
}
NSLog(@"%@",stringArray);
}
输出: (
"</div>aaaaa</div>",
"</div>bbbbbbb</div>"
)
参考:https://www.jianshu.com/p/974dee8953e6
https://www.jianshu.com/p/e48c8c3e2ff4
https://www.jianshu.com/p/63d088b5f3e5
网友评论