正则表达式大全(深度解析)

说明:

        这是一个 Swift 版的正则表达式的使用和解读。一共有三种使用的方法。和一些常用的正则表达式。

第一:首先看一个枚举

简介:它是一个写在oc里面的一个枚举,但是它使用在Swift和OC之间。

实例:

//

//  RegulareHeader.h

//  Regularexpressions

//

//  Created by 周双建 on 16/5/5.

//  Copyright © 2016 周双建. All rights reserved.

//


#ifndef RegulareHeader_h

#define RegulareHeader_h

#import <UIKit/UIKit.h>

NS_ENUM(NSInteger,RegulareType){

    // 手机号

    IphoneNumber = 0,

    // 全部小写字母

    LowercaselettersString,

    // 用户名字

    UserNameString,

    // 身份证

    IdentityString,

    //月份

    MonthString,

    // 汉字

    ChinesecharactersString,

};

#endif /* RegulareHeader_h */


使用:

 oc

#import "RegulareHeader.h"

@interface ViewController ()


@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    

    RegulareSwift * S = [[RegulareSwift alloc]init];

    NSLog(@"%d",[S checkstring:@"14" reglaretype:MonthString]);

    NSLog(@"%d",[S RegularExpression:@"18811520397" reglaretype:IphoneNumber]);


    // Do any additional setup after loading the view, typically from a nib.

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

其中的 reglaretype:IphoneNumber 就是其使用。

Swift

import Foundation

class RegulareSwift: NSObject {

    internal

    func checkstring(dostring:String, reglaretype:RegulareType) -> Bool {

        let Value:Int = reglaretype.rawValue;


其中reglaretype.rawValue 就是其使用。



第二:正则大典。


//

//  RegulareSwift.swift

//  Regularexpressions

//

//  Created by 周双建 on 16/5/5.

//  Copyright © 2016 周双建. All rights reserved.

/*

 一、什么是正则表达式

   正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。

 二、常用词的介绍

     “\d”匹配一个数字字符。等价于[0-9]

 

   “\D”匹配一个非数字字符。等价于[^0-9]

 

   “\w”匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”

 

   “\W”匹配任何非单词字符。等价于“[^A-Za-z0-9_]”

 

    “ \”将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n“\n”匹配换行符。序列“\\”匹配“\”“\(”则匹配“(”

 

    “ ^ ”匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”“\r”之后的位置。

 

    “ $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”“\r”之前的位置。

 

    “ * ”匹配前面的子表达式零次或多次(大于等于0)。例如,zo*能匹配“z”“zo”以及“zoo”*等价于{0,}

 

    “ + ”匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”+等价于{1,}

 

    “ ? ”匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”“does”中的“do”?等价于{0,1}

 

    “ {n} ” n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o

 

    “ {n,} ”n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o“o{1,}”等价于“o+”“o{0,}”则等价于“o*”

 

    “ {n,m} ” mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

 

    “ ? ”当该字符紧跟在任何一个其他限制符(*,+,?{n}{n,}{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”“o+?”将匹配单个“o”,而“o+”将匹配所有“o”

   “ . ”点匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。

 

   “ x|y ”匹配xy。例如,“z|food”能匹配“z”“food”“(z|f)ood”则匹配“zood”“food”

 

   “ [xyz] ”字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”

 

   “ [^xyz]“负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”

 

   ” [a-z] “字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.

 

   ” [^a-z] “负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”“z”范围内的任意字符。

  */


import Foundation

class RegulareSwift: NSObject {

    internal

    func checkstring(dostring:String, reglaretype:RegulareType) -> Bool {

        let Value:Int = reglaretype.rawValue;

        switch Value {

        case 0:

            // 判断手机号

            /*

             * 表达式的解读

             * ^1[3|4|5|7|8][0-9]\\d{8}$  等价于  ^1[3|4|5|7|8]\\d{9}$

             * Start: 首先,我们将表达式拆分 5 份。这5份分别是 ^1 [3|4|5|7|8][0-9]\\d{8}$

             * Analysis :

             * one: ^1 代表手机号必须是以 1 开头的。

             * two: [3|4|5|7|8] 代表是在34578 里面选任意一个数。

             * three: [0-9] 代表的是 0-9 之间的任意一个数字

             * four: \\d 等价于[0-9];\\d{8} 代表的是 0-9 之间任意匹配一个8位的字符。

             * five: $ 是以什么结尾。(例如 2$ 代表是以 2结尾的手机号:18811520392

             */

            let Predicate :NSPredicate = NSPredicate(format: "SELF MATCHES %@","^1[3|4|5|7|8][0-9]\\d{8}$")

            return Predicate .evaluateWithObject(dostring);

        case 1:

            // 全部小写字母(还可以添加字母的长度限制)

            /*

             * 表达式的解读

             * ^[a-z]{5}$

             * 这个表达式代表 以小写字母开头长度为5的字符

             *

             * ^[a-z]+$

             * 这个代表不限制长度的小写字符串

             *

             */

            let Predicate :NSPredicate = NSPredicate(format: "SELF MATCHES %@","^[a-z]{5}$")

            return Predicate .evaluateWithObject(dostring);

        case 2:

             // 判断用户名(6-16)

             /*

             *  AppID 的用户名

             *  ^[A-Z][a-zA-Z0-9_]{5,15}$  同于 ^[A-Z]\\w{5,15}$

             *  \w  等价于 [a-zA-Z0-9_]

             *

             *  用户名没有限制

             *  ^\\w{6,16}$     |  ^.{6,16}$

             *

             */

            let Predicate :NSPredicate = NSPredicate(format: "SELF MATCHES %@","^\\w{6,16}$")

            return Predicate .evaluateWithObject(dostring);

        case 3:

            // 身份证

            let Predicate :NSPredicate = NSPredicate(format: "SELF MATCHES %@","\\d{14}[0-9xX]{0,4}$")

            return Predicate .evaluateWithObject(dostring);

        case 4:

            // 月份 00 -09    10 -12

            /*

             * 表达式的解读

             *  ^0\\d|^1[^3-9]

             *  [^3-9] 是代表只能获取 0-2之间的数

             */

            let Predicate :NSPredicate = NSPredicate(format: "SELF MATCHES %@","^0\\d|^1[^3-9]")

            return Predicate .evaluateWithObject(dostring);

        default:

            break

        }

        return false;

    }

    

    func StringCheck(dostring:String ,reglaretype:RegulareType) -> Bool {

        let Value:Int = reglaretype.rawValue;

        switch Value {

        case 0:

            // 判断手机号

            /*

             * 表达式的解读

             * ^1[3|4|5|7|8][0-9]\\d{8}$  等价于  ^1[3|4|5|7|8]\\d{9}$

             * Start: 首先,我们将表达式拆分 5 份。这5份分别是 ^1 [3|4|5|7|8][0-9]\\d{8}$

             * Analysis :

             * one: ^1 代表手机号必须是以 1 开头的。

             * two: [3|4|5|7|8] 代表是在34578 里面选任意一个数。

             * three: [0-9] 代表的是 0-9 之间的任意一个数字

             * four: \\d 等价于[0-9];\\d{8} 代表的是 0-9 之间任意匹配一个8位的字符。

             * five: $ 是以什么结尾。(例如 2$ 代表是以 2结尾的手机号:18811520392

             */

            if  (dostring.rangeOfString("^1[3|4|5|7|8][0-9]\\d{8}$", options:.RegularExpressionSearch) != nil){

                return true;

            }


        case 1:

            // 全部小写字母(还可以添加字母的长度限制)

            /*

             * 表达式的解读

             * ^[a-z]{5}$

             * 这个表达式代表 以小写字母开头长度为5的字符

             *

             * ^[a-z]+$

             * 这个代表不限制长度的小写字符串

             *

             */

            if  (dostring.rangeOfString("^[a-z]{5}$", options:.RegularExpressionSearch) != nil){

                return true;

            }

        case 2:

            // 判断用户名(6-16)

            /*

             *  AppID 的用户名

             *  ^[A-Z][a-zA-Z0-9_]{5,15}$  同于 ^[A-Z]\\w{5,15}$

             *  \w  等价于 [a-zA-Z0-9_]

             *

             *  用户名没有限制

             *  ^\\w{6,16}$     |  ^.{6,16}$

             *

             */

            if  (dostring.rangeOfString("^\\w{6,16}$", options:.RegularExpressionSearch) != nil){

                return true;

            }

        case 3:

            // 身份证

            if  (dostring.rangeOfString("\\d{14}[0-9xX]{0,4}$", options:.RegularExpressionSearch) != nil){

                return true;

            }

        case 4:

            // 月份 00 -09    10 -12

            /*

             * 表达式的解读

             *  ^0\\d|^1[^3-9]

             *  [^3-9] 是代表只能获取 0-2之间的数

             */

            if  (dostring.rangeOfString("^0\\d|^1[^3-9]", options:.RegularExpressionSearch) != nil){

                return true;

            }

        default:

            break

        }

        return false;

    }

    

    func RegularExpression(dostring:String ,reglaretype:RegulareType) -> Bool {

        let Value:Int = reglaretype.rawValue;

        switch Value {

        case 0:

            // 判断手机号

            /*

             * 表达式的解读

             * ^1[3|4|5|7|8][0-9]\\d{8}$  等价于  ^1[3|4|5|7|8]\\d{9}$

             * Start: 首先,我们将表达式拆分 5 份。这5份分别是 ^1 [3|4|5|7|8][0-9]\\d{8}$

             * Analysis :

             * one: ^1 代表手机号必须是以 1 开头的。

             * two: [3|4|5|7|8] 代表是在34578 里面选任意一个数。

             * three: [0-9] 代表的是 0-9 之间的任意一个数字

             * four: \\d 等价于[0-9];\\d{8} 代表的是 0-9 之间任意匹配一个8位的字符。

             * five: $ 是以什么结尾。(例如 2$ 代表是以 2结尾的手机号:18811520392

             */

            

            // 输出结果

            do {

                // - 1、创建规则

                let pattern = "[1-9][0-9]{4,14}"

                // - 2、创建正则表达式对象

                let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)

                // - 3、开始匹配

                let   res = regex.matchesInString(dostring, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, dostring.characters.count))

                // 输出结果

                if (res.count != 0)  {

                    return true

                }

            }

            catch {

                print(error)

            }

            

        case 1:

            // 全部小写字母(还可以添加字母的长度限制)

            /*

             * 表达式的解读

             * ^[a-z]{5}$

             * 这个表达式代表 以小写字母开头长度为5的字符

             *

             * ^[a-z]+$

             * 这个代表不限制长度的小写字符串

             *

             */

            // 输出结果

            do {

                // - 1、创建规则

                let pattern = "^[a-z]{5}"

                // - 2、创建正则表达式对象

                let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)

                // - 3、开始匹配

                let   res = regex.matchesInString(dostring, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, dostring.characters.count))

                // 输出结果

                if (res.count != 0)  {

                    return true

                }

            }

            catch {

                print(error)

            }

        case 2:

            // 判断用户名(6-16)

            /*

             *  AppID 的用户名

             *  ^[A-Z][a-zA-Z0-9_]{5,15}$  同于 ^[A-Z]\\w{5,15}$

             *  \w  等价于 [a-zA-Z0-9_]

             *

             *  用户名没有限制

             *  ^\\w{6,16}$     |  ^.{6,16}$

             *

             */

            // 输出结果

            do {

                // - 1、创建规则

                let pattern = "^\\w{6,16}$"

                // - 2、创建正则表达式对象

                let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)

                // - 3、开始匹配

                let   res = regex.matchesInString(dostring, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, dostring.characters.count))

                // 输出结果

                if (res.count != 0)  {

                    return true

                }

            }

            catch {

                print(error)

            }


        case 3:

            // 身份证

            // 输出结果

            do {

                // - 1、创建规则

                let pattern = "\\d{14}[0-9xX]{0,4}"

                // - 2、创建正则表达式对象

                let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)

                // - 3、开始匹配

                let   res = regex.matchesInString(dostring, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, dostring.characters.count))

                // 输出结果

                if (res.count != 0)  {

                    return true

                }

            }

            catch {

                print(error)

            }


            

        case 4:

            // 月份 00 -09    10 -12

            /*

             * 表达式的解读

             *  ^0\\d|^1[^3-9]

             *  [^3-9] 是代表只能获取 0-2之间的数

             */

            // 输出结果

            do {

                // - 1、创建规则

                let pattern = "^0\\d|^1[^3-9]"

                // - 2、创建正则表达式对象

                let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)

                // - 3、开始匹配

                let   res = regex.matchesInString(dostring, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, dostring.characters.count))

                // 输出结果

                if (res.count != 0)  {

                    return true

                }

            }

            catch {

                print(error)

            }

            

        default:

            break

        }

        return false;

    }

};



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值