iOS 中的正则匹配(工具类)

  正则表达式

  正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个"规则字符串",

  这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码.

  在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要,

  比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求)

  下面让我们先来看看正则匹配常用的一些字符:

  一. 常用通配符

  . 匹配除换行符以外的任意字符

  \w 匹配字母或数字或下划线或汉字

  \s 匹配任意的空白符(空格,tab\t,回车\r \n)

  \d 匹配数字

  ^ 匹配字符串的开始

  $ 匹配字符串的结束

  \b 匹配单词的开始或结束

  二. 常用反义通配符

  \W 匹配任意不是字母,数字,下划线,汉字的字符

  \S 匹配任意不是空白符的字符

  \D 匹配任意非数字的字符

  \B 匹配不是单词开头或结束的位置

  [^x] 匹配除了x以外的任意字符

  [^aeiou] 匹配除了aeiou这几个字母以外的任意字符

  三. 集合

  [xyz] 匹配xyz中任意的字符

  [^xyz] 匹配不是xyz中的任意字符

  [a-z] 匹配从小写字母a到小写字母z之间的任意字符

  [^a-z] 匹配非从小写字母a到小写字母z之间的任意字符

  四. 常用限定符

  * 重复零次或更多次

  + 重复一次或更多次

  ? 重复零次或一次

  {n} 重复n次

  {n,} 重复n次或更多次

  {n,m} 重复n到m次

  五. 贪婪和懒惰模式(默认是贪婪模式;在量词后面直接加上问号,就是非贪婪模式)

  *? 重复任意次,但尽可能少重复

  +? 重复一次或更多次,但尽可能少重复

  ?? 重复零次或一次,但尽可能少重复

  {n,m}? 重复n到m次,但尽可能少重复

  {n,}? 重复n次以上,但尽可能少重复

  以上就是正则表达式的匹配规则需要使用到的字符.

  下面是我在开发中常用到的和平时收集的一些正则匹配,为了方便,整理下封装成一个工具类,提供类方法来方便调用,返回匹配结果.

  可能上面的匹配字符有些朋友看不太明白,那就不说废话了,上代码,多看几次应该就明白了.

  代码示例

//
//  RegularTool.h
//  正则匹配
//
//  Created by Arvin on 15/12/3.
//  Copyright © 2015年 Arvin. All rights reserved.
//

#import 

@interface RegularTool: NSObject

/*!
 *  匹配固定电话号码
 *
 *  @param number 需要匹配的固话号码
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchTelephoneNumber:(NSString *)number;

/*!
 *  匹配手机号码
 *
 *  @param number 需要匹配的手机号码
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchMobilephoneNumber:(NSString *)number;

/*!
 *  匹配3-15位的中文或英文(用户名)
 *
 *  @param username 需要匹配的字符串
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchUsername:(NSString *)username;

/*!
 *  匹配6-18位的数字和字母组合(密码)
 *
 *  @param password 需要匹配的字符串
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchPassword:(NSString *)password;

/*!
 *  匹配邮箱帐号
 *
 *  @param email 需要匹配的邮箱帐号
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchEmail:(NSString *)email;

/*!
 *  匹配身份证号码
 *
 *  @param idCard 需要匹配的身份证号码
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchUserIdCard:(NSString *)idCard;

/*!
 *  匹配URL字符串
 *
 *  @param urlStr 需要匹配的URL字符串
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchURLStr:(NSString *)urlStr;

/*!
 *  匹配¥:价格字符串
 *
 *  @param priceStr 包含价格的字符串
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchPriceStr:(NSString *)priceStr;

@end
//
//  RegularTool.m
//  正则匹配
//
//  Created by Arvin on 15/12/3.
//  Copyright © 2015年 Arvin. All rights reserved.
//

#import "RegularTool.h"

@implementation RegularTool

#pragma mark - 匹配固定电话号码
+ (BOOL)matchTelephoneNumber:(NSString *)number {
    NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$";
    return [RegularTool matchString:number withPattern:pattern];
}

#pragma mark - 匹配手机号码
+ (BOOL)matchMobilephoneNumber:(NSString *)number {
    NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$";
    return [RegularTool matchString:number withPattern:pattern];
}

#pragma mark - 匹配3-15位的中文或英文(用户名)
+ (BOOL)matchUsername:(NSString *)username {
    NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$";
    return [RegularTool matchString:username withPattern:pattern];
}

#pragma mark - 匹配6-18位的数字和字母组合(密码)
+ (BOOL)matchPassword:(NSString *)password {
    NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$";
    return [RegularTool matchString: password withPattern: pattern];
}

#pragma mark - 匹配邮箱帐号
+ (BOOL)matchEmail:(NSString *)email {
    NSString *pattern =
    @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$";
    return [RegularTool matchString:email withPattern:pattern];
}

#pragma mark - 匹配身份证号码
+ (BOOL)matchUserIdCard:(NSString *)idCard {
    NSString *pattern =
    @"(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)";
    return [RegularTool matchString:idCard withPattern:pattern];
}

#pragma mark - 匹配URL字符串
+ (BOOL)matchURLStr:(NSString *)urlStr {
    NSString *pattern = @"^[0-9A-Za-z]{1,50}$";
    return [RegularTool matchString:urlStr withPattern: pattern];
}

#pragma mark - 匹配¥:价格字符串
+ (BOOL)matchPriceStr:(NSString *)priceStr {
    NSError *error = nil;
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:@"¥(\\d+(?:\\.\\d+)?)" options: 1 << 0 error: &error];
    if (!error) {
        NSArray *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, priceStr.length)];
        if (result) {
            for (NSTextCheckingResult *checkingRes in result) {
                if (checkingRes.range.location == NSNotFound) {
                    continue;
                }
                NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]);
                //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]);
            }
        }
        return YES;
    }
    NSLog(@"匹配失败,Error: %@",error);
    return NO;
}


/*!
 *  正则匹配
 *
 *  @param str     匹配的字符串
 *  @param pattern 匹配规则
 *
 *  @return 返回匹配结果
 */
+ (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern {
    NSError *error = nil;
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error];
    if (!error) {
        NSTextCheckingResult *result = [regular firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];
        if (result) {
            NSLog(@"匹配成功,Result: %@",[str substringWithRange:result.range]);
            return YES;
        }
    }
    NSLog(@"匹配失败,Error: %@",error);
    return NO;
}

@end

相关阅读

网友评论

AdOnCn#1. AdOnCn
很好,感谢!
 Said on: 2016/1/4 19:11:04喜欢[0]
无吐槽,不精彩,期待您的参与。

吐槽几句

  "(必填)"

  "(选填)"

  "(必填,不公开)"

(必填,最多100个字符。)(大家的评论

先说这么多吧