前言:在表达验证中,我们经常会使用到正则,应为我们需要用于来判断用户输入的字符是否为合法的,如果是不合法的,那么应该提示用户输入错误,并不让提交至服务器。我们也可以通过正则表达式,从用户输入的字符串中过滤并获取我们想要的特定部分。总而言之,正则表达式是非常强大的。
一、谓词(NSPredicate)创建正则表达式
使用它来判断用户输入的字符串是否为合法的:
- (void)viewDidLoad {
[super viewDidLoad];
// 编写正则表达式:只能是数字或英文,或两者都存在
NSString *regex = @"^[a-z0-9A-Z]*$";
// 创建谓词对象并设定条件的表达式
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
// 判断的字符串
NSString *str = @"Hello100s";
// 对字符串进行判断
BOOL result = [predicate evaluateWithObject:str];
NSLog(@"%s",(result)?"YES":"NO");//YES
}
二、NSString自带的正则查找,替换方法
1、正则查找方法:
- ①、 - (NSRange)rangeOfString:(NSString *)aString; //查询是否包含某字符串,返回匹配部分在哪里以及能够匹配的字符个数(NSRange类型);如果未查找到,或者该字符串为“”,则返回{NSNotFound, 0};
- ②、 - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;//功能同上,options中选项可在xcode中查找,其中选择 NSBackwardsSearch,系统会从字符串的尾部开始查找;
- ③、 - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;//功能同上,searchRange在指定范围内查找;
- ④、 - (NSRange)rangeOfString:(NSString )aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(NSLocale )locale;//功能同上,多了个locale属性:本地化语言。
2、正则替换方法:
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange;
其中:
target:目标查找字符串;
replacement:替换字符串;
options:NSStringCompareOptions类型,在Xcode中可以查看,如果选择NSBackwardsSearch,系统会从字符串的尾部开始查找;
searchRange:在指定的范围内查找。
三、正则表达式类: NSRegularExpression
该类包含的方法如下:
- (1)、 - (NSArray )matchesInString:(NSString )string options:(NSMatchingOptions)options range:(NSRange)range;//返回所有匹配结果的集合(适合,从一段字符串中提取我们想要匹配的所有数据);
- (2)、 - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回正确匹配的个数(通过等于0,来验证邮箱,电话什么的,代替NSPredicate);
- (3)、 - (NSTextCheckingResult )firstMatchInString:(NSString )string options:(NSMatchingOptions)options range:(NSRange)range;//返回第一个匹配的结果。注意,匹配的结果保存在NSTextCheckingResult类型中,
- (4)、 - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回第一个正确匹配结果字符串的NSRange;
- (5)、 - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;//block方法
(6)、//创建类
- ①、+ (NSRegularExpression )regularExpressionWithPattern:(NSString )pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
②、 - (instancetype)initWithPattern:(NSString )pattern options:(NSRegularExpressionOptions)options error:(NSError *)error NS_DESIGNATED_INITIALIZER;
其中:- ①、pattern:正则表达式;
②、options:NSRegularExpressionOptions类,包含如下
typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) { NSRegularExpressionCaseInsensitive = 1 << 0, /* Match letters in the pattern independent of case. */不区分大小写 NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, /* Ignore whitespace and #-prefixed comments in the pattern. */忽略空格和#- NSRegularExpressionIgnoreMetacharacters = 1 << 2, /* Treat the entire pattern as a literal string. */整体化 NSRegularExpressionDotMatchesLineSeparators = 1 << 3, /* Allow . to match any character, including line separators. */匹配任何字符,包括行分隔符 NSRegularExpressionAnchorsMatchLines = 1 << 4, /* Allow ^ and $ to match the start and end of lines. */允许……和$在匹配的开始和结束行 NSRegularExpressionUseUnixLineSeparators = 1 << 5, /* Treat only \n as a line separator (otherwise, all standard line separators are used). */查找范围为整个话无效 NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 /* Use Unicode TR#29 to specify word boundaries (otherwise, traditional regular expression word boundaries are used). */查找范围为整个话无效 };
例如:
1、查看电话号码
#define KPhoneRegex @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}"
- (void)result{
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在这里啊啊啊啊s15279107716";
NSError *error = NULL;
// 根据匹配条件,创建了一个正则表达式(类方法,实例方法类似)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];
if (regex != nil) {
//该数组中存放NSTextCheckingResult元素
NSArray* array = [regex matchesInString:urlString options:0 range:NSMakeRange(0, urlString.length)];
for (int i = 0; i < array.count ; i ++) {
NSTextCheckingResult* result = array[i];
NSRange resultRange = [result rangeAtIndex:0];
//从urlString中截取数据
NSString *result2 = [urlString substringWithRange:resultRange];
NSLog(@"result = %@",result2);
}
// 返回满足查询条件的个数
NSUInteger number = [regex numberOfMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length])];
NSLog(@"number = %ld",number);
//block遍历
[regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSLog(@"---%@",NSStringFromRange([result range]));
if (flags != NSMatchingInternalError) {
NSRange firstHalfRange = [result rangeAtIndex:0];
if (firstHalfRange.length > 0) {
NSString *resultString1 = [urlString substringWithRange:firstHalfRange];
NSLog(@"result1 = %@",resultString1);
}
}
// *stop = NO;//若想只获取第一个数据,可设置*stop = NO;
}];
}
}
2、替换查询到的字符串
- (void)result{
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在这里啊啊啊啊s15279107716";
NSError *error = NULL;
// 根据匹配条件,创建了一个正则表达式(类方法,实例方法类似)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];
if (regex != nil) {
// 替换掉你要匹配的字符串
NSString *reString = [regex stringByReplacingMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) withTemplate:@"(我就是替换的值)"];
NSLog(@"reString = %@",reString);
}
}