正则表达式

前言:在表达验证中,我们经常会使用到正则,应为我们需要用于来判断用户输入的字符是否为合法的,如果是不合法的,那么应该提示用户输入错误,并不让提交至服务器。我们也可以通过正则表达式,从用户输入的字符串中过滤并获取我们想要的特定部分。总而言之,正则表达式是非常强大的。

一、谓词(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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxiaobukuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值