iOS之正则表达式

Posted IT见读

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之正则表达式相关的知识,希望对你有一定的参考价值。

ios中正则表达式匹配用NSRegularExpression类。首先讲解下正则的匹配方式,再用NSRegularExpression去验证。

为什么使用正则

例如,NSStrig尽管提供了搜索和替换字符串的方法,若想找到一段文本的子串,要写循环,缺乏灵活性。通过使用正则,可以做到:

  • 2、替换文本。例:识别文本中的特定字符,完全删除或用其他文本替换;

  • 基于模式匹配提取子字符串。查找文档内特定的字符串;

匹配符号

非打印字符

\cx 匹配由x指明的控制字符。\cM匹配Control-M或回车符,x必须为a-z或A-Z,否则,c为原义de‘c’字符。
\f 匹配换页符。
\n 匹配换行符。
\r 匹配回车符。
\s 匹配任何空白字符,包括空格、制表符、换页符等。
\S 匹配任何非空白字符,等价于[^\f\n\r\t\v]。
\t 匹配制表符
\v 匹配垂直制表符

特殊符号

要匹配特殊字符本身,需在前加\。
$ 匹配输入字符串的结束位置
() 子表达式的开始和结束位置
* 0或多个字符
+ 一个或多个字符
. 匹配除换行符之外的任何字符
[ 中括号表达式的开始,. 特殊字符在中括号表达式时 如 [.] 只会匹配 .字符
? 0或1个字符
\ 下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符
^ 匹配输入字符串的开始位置,在方括号中使用,表示不接受该字符集合
{ 限制符表达式开始
| 两项之间的一个选择

限制符

表示正则的一个给定组件必须要出现多少次才满足匹配。
匹配前面子表达式0或多次
+ 匹配前面子表达式1或多次
?匹配前面子表达式0或1次
{n} n是非负整数,匹配n次
{n,} n是非负整数,至少匹配n次
{n,m} n和m均非负整数,其中n<=m,最少匹配n次最多匹配m次
、+限制符是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

定位符

定位符指能固定到行首或行尾。
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
\b 匹配一个字边界,即字与空格间的位置
\B 非字边界匹配
注意: 不要将限制符与定位符一起使用。因在换行或字边界的前或后面不能有一个以上的位置,因此不允许有^*之类的表达式。

选择

用圆括号将所有选项括起来,相邻的选项间用|分割。但有副作用,使相关的匹配会被缓存,此时用?:放在第一个选项来消除。
?:、?=和?!使三个非捕获元,?=是正向检查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,?!为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

其他

\w 匹配字母、数字、下划线。等价于[A-Za-z0-9]
\W 匹配非字母、数字、下划线。等价于[^A-Za-z0-9]
/i 不区分大小写
/g 表示替换将针对行中每个匹配的串进行,否则则只替换行中第一个匹配串
/d 相当于[0-9]

上述是基本的匹配字符,后续用到会继续添加。下面介绍几个常用的匹配字符族:

[a-z] //匹配所有的小写字母 
[A-Z] //匹配所有的大写字母 
[a-zA-Z] //匹配所有的字母 
[0-9] //匹配所有的数字 
[0-9\.\-] //匹配所有的数字,句号和减号 
[ \f\r\t\n] //匹配所有的白字符
[^a-z] //除了小写字母以外的所有字符 
[^\\\/\^] //除了(\)(/)(^)之外的所有字符 
[^\"\'] //除了双引号(")和单引号(')之外的所有字符
^[a-zA-Z0-9_]{1,}$      // 所有包含一个以上的字母、数字或下划线的字符串 
^[1-9][0-9]{0,}$        // 所有的正整数 
^\-{0,1}[0-9]{1,}$      // 所有的整数 
^[-]?[0-9]+\.?[0-9]+$   // 所有的浮点数
^[a-zA-Z0-9_]+$      // 所有包含一个以上的字母、数字或下划线的字符串 
^[1-9][0-9]*$        // 所有的正整数 
^\-?[0-9]+$          // 所有的整数 
^\-?[0-9]+\.?[0-9]*$ // 所有的浮点数
[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}     //邮箱
1\\d{10}        //电话号码
(http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?  //url
\\d{3}-\\d{8}|\\d{4}-\\d{8} 中国电话号码
[1-9]\\d{5}(?!\\d) 邮政号码

最后演示个密码的等级评分:

- (NSInteger)passwordLevel:(NSString *)str {
    if (!str) {
        return 0;
    }
    NSInteger score = 0;
    NSArray *regexArr = @[@"[0-9]", @"[a-z]", @"[A-Z]", @"[^\\w_]"];
    NSInteger repeatCount = 0;

    char prevChar='\0';
    NSInteger len = str.length;
    score += len > 18 ? 18 : len;

    for (NSInteger i = 0, num = regexArr.count; i < num; i++) {
        NSRegularExpression *exp = [[NSRegularExpression alloc]initWithPattern:[regexArr objectAtIndex:i] options:NSRegularExpressionCaseInsensitive error:nil];
        NSArray *array = [exp matchesInString:str options:NSMatchingReportCompletion range:NSMakeRange(0, str.length)];
        if (array.count > 0) {
            score += 4;
        }
        if (array.count >= 2) {
            score += 2;
        }
        if (array.count >= 5) {
            score += 2;
        }
    }

    const char *p = [str cStringUsingEncoding:NSASCIIStringEncoding];
    for (NSInteger i = 0, num = str.length; i < num; i++) {
        char c = p[i];
        if (c == prevChar) {
            repeatCount++;
        }else {
            prevChar = c;
        }
    }

    score -= repeatCount * 1;

    return score;
}

以上是关于iOS之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

iOS之正则表达式

iOS之正则表达式(转载)

通过 Java 正则表达式提取 semver 版本字符串的片段

Python学习笔记之正则表达式

iOS之正则表达式的使用

iOS之NSPredicate(正则表达式和UIBarController):谓词