一个正则表达式组成:
条件表达式(0-n个,不一定有)+子表达式(必须有)
表达式 | 预查方式 |
---|---|
(?=[pattern]+$) |
正向肯定预查(allIs,全都是) |
(?![pattern]+$) |
正向否定预查(notAll,不全是) |
(?=.*[pattern]) |
正向肯定预查(contain,包含) |
(?!.*[pattern]) |
正向否定预查(notContain,不包含) |
(?!.*[pattern].*) |
正向否定预查(allNot,全不是) |
(?![pattern]).* |
正向否定预查(allNot,全不是) |
分析上表:
粗略的理解:?= 全都是
,?! 不全是
,?=.* 包含
,?!.* 不包含
第五个: (?!.*[pattern].*)
?!.*[pattern]
表示不包含pattern,结尾的.*
表示除\n\r之外的任意字符出现0-n次,也就是0次,1次,2次。。。n次的都匹配出来了,所以是全不是。
同时包含字母和数字怎么写?
((?=.*\d)(?=.*[a-zA-Z]))[\da-zA-Z]*
分析:条件表达式最外层括号加不加都行,而且条件表达式限定了必须包含字母或者数字,而且后面的[\da-zA-Z]又限定了必须是字母或者数字,*
表示出现任意次,但是由于条件表达式,这里的*
也就不可能匹配到为0的时候。
匹配:(数字)
#匹配str中的(数字)
NSString *str = @"(01)9729/219(02)4361371";
NSString *reguStr = @"\\([0-9]*\\)";
匹配@®开头,®结尾的字符串。
#pragma Mrhan- 匹配@®开头,®结尾的字符串。
-(void)zhengZeBiaoDaShi
{
NSString *contentString = @"@韩sdafasd@®2 ®军,woca@®nimaheh呵呵®";
NSString *reguStr = @"@®([\\da-zA-Z[\u4e00-\u9fa5]]*)®";
//(@®|®)
//@®([\\da-zA-Z[\u4e00-\u9fa5]]*)®
NSLog(@"regustr===%@",reguStr);
NSRegularExpression * regularExpression = [NSRegularExpression regularExpressionWithPattern:reguStr options:NSRegularExpressionCaseInsensitive error:nil];
//匹配字符串 第一个参数: 在哪个字符串中进行匹配 第二个参数: 匹配方式: 全部匹配 第三个参数: 匹配范围 返回值 (NSArray<NSTextCheckingResult *> *)
NSArray * checkingResult = [regularExpression matchesInString:contentString options:NSMatchingReportCompletion range:NSMakeRange(0, contentString.length)];
NSLog(@"checkingResult--%@",checkingResult);
//遍历数组., 获取匹配成功的字符串的范围 NSRange (因为替换后, 字符串的长度在改变,所以使用倒序来进行替换,来避免范围越界问题)
for (NSInteger i = checkingResult.count-1 ; i<checkingResult.count; i--) {
//获取range
NSTextCheckingResult *result = checkingResult[i];
NSLog(@"result.range--%@",NSStringFromRange(result.range));
}
}