iOS正则表达式

作者: 西南柯北 | 来源:发表于2017-07-17 18:07 被阅读201次

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
    ^ 指出一个字符串的开始
    $指出一个字符串的结束
    "^iOS" 以iOS开头
    "iOS$" 以iOS结尾
    "^apple$" 开始和结尾都是apple的字符串,这个是唯一的,实际上就是apple
    "apple" 包含apple
    * , +,? 重复出现的次数。 ? 0~1; + 1~n; * 0~n
    "ab*"一个a后面跟着0~n个b
    "ab+":一个a后面跟着至少一个b
    "ab?":一个a后面跟着0~1个b
    "a?b+$":末尾有01个a跟着1n个b
    {} 表示重复的具体范围。
    "ab{4}" 一个a跟着4b
    "ab{1,}" 一个a跟着至少1个b
    "ab{3,5}" 一个a跟着3~5个b
    *可以用{0,}表示,+可以用{1,}表示,?可以用{0,1}表示
    | “或”操作:
    "a|b" 一个字符串里有a或b
    "(a|bcd)ef" aef或bcdef
    "(a|b)+c" 一串a和b混合的字符串后面跟一个c;
    [ ]表示在括号内的众多字符中,选择1-n个括号内的符合语法的字符作为结果
    "[ab]" 一个a或b(相当于"a|b");
    "[a-d]"a到d中的一个(相当于"a|b|c|d"或者"[abcd]"
    "^[a-zA-Z]" 以字母开头
    "[0-9]a" a前有一位的数字
    "[a-zA-Z0-9]$" 以一个字母或数字结束
    . 任意字符
    "a.[a-z]" a后面跟一个任意字符和一个小写字母
    "^.{5}$" 长度为5的字符串
    "(.)\1" 两个连续任意字符
    "(.)\1{2}" 三个个连续任意字符
    在方括号里用^表示不希望出现的字符,^应在方括号里的第一位。
    "@[^a-zA-Z]@"表示两个@中不应该出现字母
    "\d" 一个数字字符
    "\D" 一个非数字字符
    "\w " 包括下划线的任何单词字符
    "\W" 匹配任何非单词字符
    iOS中书写正则表达式,碰到转义字符,多加一个\

    正则表达式在IOS开发中的应用
    一、根据正则表达式创建NSRegularExpression对象
    初始化方法
    <pre>
    public init(pattern: String, options: NSRegularExpression.Options = []) throws
    </pre>
    其中,pattern是正则表达式,对于option参数,在oc中它是一个枚举,swift中它是结构体options中的属性
    <pre>
    public struct Options : OptionSet {

        public init(rawValue: UInt)
    
        
        public static var caseInsensitive: NSRegularExpression.Options { get }
    
        public static var allowCommentsAndWhitespace: NSRegularExpression.Options { get }
    
        public static var ignoreMetacharacters: NSRegularExpression.Options { get }
    
        public static var dotMatchesLineSeparators: NSRegularExpression.Options { get }
    
        public static var anchorsMatchLines: NSRegularExpression.Options { get }
    
        public static var useUnixLineSeparators: NSRegularExpression.Options { get }
    
        public static var useUnicodeWordBoundaries: NSRegularExpression.Options { get }
    }
    

    </pre>
    <pre>
    caseInsensitive //不区分字母大小写
    allowCommentsAndWhitespace //忽略掉正则表达式中的空格和#号之后的字符
    ignoreMetacharacters //将正则表达式整体作为字符串处理
    dotMatchesLineSeparators //允许.匹配任何字符,包括换行符
    anchorsMatchLines //允许^和$符号匹配行的开头和结尾
    useUnixLineSeparators //设置\n为唯一的行分隔符,否则所有的都有效。
    useUnicodeWordBoundaries //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
    </pre>

    二、执行查询操作
    1、以block的形式返回查询结果
    <pre>
    open func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Swift.Void)
    </pre>
    参数string是待查询的字符串,options的参数如下:
    <pre>
    public struct MatchingOptions : OptionSet {

        public init(rawValue: UInt)
    
        
        public static var reportProgress: NSRegularExpression.MatchingOptions { get }
        public static var reportCompletion: NSRegularExpression.MatchingOptions { get } 
        public static var anchored: NSRegularExpression.MatchingOptions { get }
    
        public static var withTransparentBounds: NSRegularExpression.MatchingOptions { get }
    
        public static var withoutAnchoringBounds: NSRegularExpression.MatchingOptions { get } 
    

    }
    </pre>
    <pre>
    reportProgress //找到最长的匹配字符串后调用block回调
    reportCompletion //找到任何一个匹配串后都回调一次block
    anchored //从匹配范围的开始出进行极限匹配
    withTransparentBounds //允许匹配的范围超出设置的范围
    withoutAnchoringBounds //禁止^和$自动匹配行还是和结束
    </pre>
    参数block回调中,NSTextCheckingResult类型的参数即是查询结果;MatchingFlags类型的参数flags如下:
    <pre>
    public struct MatchingFlags : OptionSet {

        public init(rawValue: UInt)
    
     
        public static var progress: NSRegularExpression.MatchingFlags { get } 
        public static var completed: NSRegularExpression.MatchingFlags { get }
    
        public static var hitEnd: NSRegularExpression.MatchingFlags { get } 
    
        public static var requiredEnd: NSRegularExpression.MatchingFlags { get }
    
        public static var internalError: NSRegularExpression.MatchingFlags { get }
    

    }
    </pre>
    <pre>
    progress //匹配到最长串时被设置
    completed //全部分配完成后被设置
    hitEnd //匹配到设置范围的末尾时被设置
    requiredEnd //当前匹配到的字符串在匹配范围的末尾时被设置
    internalError //由于错误导致的匹配失败时被设置
    </pre>
    block中还有个类型为UnsafeMutablePointer<ObjCBool>的参数,给它的pointee属性赋值为true,之后便会停止查找

    2、查找结果以数组的形式返回
    <pre>
    open func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
    </pre>
    3、返回匹配到的个数
    <pre>
    open func numberOfMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> Int
    </pre>
    4、返回匹配到的第一个结果
    <pre>
    open func firstMatch(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> NSTextCheckingResult?
    </pre>
    5、返回匹配到的第一个结果的range
    <pre>
    open func rangeOfFirstMatch(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> NSRange
    </pre>
    6、将匹配到的结果替换为新的字符串,并将替换后生成的新的字符串返回
    <pre>
    open func stringByReplacingMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, withTemplate templ: String) -> String
    </pre>
    7、将原字符串中匹配到的结果用指定的字符串替换,返回值为Int类型,是匹配并替 换的个数
    <pre>
    open func replaceMatches(in string: NSMutableString, options: NSRegularExpression.MatchingOptions = [], range: NSRange, withTemplate templ: String) -> Int
    </pre>

    相关文章

      网友评论

        本文标题:iOS正则表达式

        本文链接:https://www.haomeiwen.com/subject/xionhxtx.html