您的位置:时时app平台注册网站 > 编程知识 > iOS开发,谓词(NSPredicate)的用法:(二)谓词和

iOS开发,谓词(NSPredicate)的用法:(二)谓词和

2019-09-14 00:43
  • 用户输入的用户名,密码是否符合要求和规范
  • 截取符合某正则表达式的字符串
  • 将符合某正则表达式的字符串进行替换正则表达式, 你可以理解为一门新的语言, 那么新的语言, 就有新的语法.正则的语法其实还蛮复杂的, 但是简单的,常见的就那么几句.

特殊字符

所谓特殊字符,就是一些有特殊含义的字符。

特别字符 描述
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,请使用 $。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
匹配前面的子表达式一次或多次。要匹配 字符,请使用 。
. 匹配除换行符 n 之外的任何单字符。要匹配 . ,请使用 . 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '' 匹配 "",而 '(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。
{ 标记限定符表达式的开始。要匹配 {,请使用 {。
| 指明两项之间的一个选择。要匹配 |,请使用 |。
x|y 匹配x或y。例如,“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”范围内的任意字符

iOS开发,谓词(NSPredicate)的用法:(二)谓词和正则表达式配合使用,进行表单内容判断

在上一篇中,我们聊了NSPredicate的基本用法:谓词的基本语法、谓词的定义和使用。在本篇中,我们聊聊NSPredicate和正则表达式的结合使用来进行表单内容的筛选。

我们常常遇到这种需求:要求用户输入的用户名必须是字母、密码必须是数字、判断用户输入的手机号是否合法等等。这些需求我们就可以使用NSPredicate和正则表达式来配合筛选了。

首先我们来说说正则表达式。正则表达式的语法非常复杂,对于一般的验证条件,我们可以在网上找到现成的表达式,拿来就能用,我展示一些常用的正则出来:

 

1.验证用户名和密码:("^[a-zA-Z]w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
2.验证电话号码:("^(\d{3,4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3.验证手机号码:"^1[3|4|5|7|8][0-9]\d{8}$";
4.验证身份证号(15位或18位数字):"\d{14}[[0-9],0-9xX]";
5.验证Email地址:("^\w ([- .]\w )*@\w ([-.]\w )*.\w ([-.]\w )*$");
6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9] $") ;
7.整数或者小数:^[0-9] ([.]{0,1}[0-9] ){0,1}$
8.只能输入数字:"^[0-9]*$"。
9.只能输入n位的数字:"^\d{n}$"。
10.只能输入至少n位的数字:"^\d{n,}$"。
11.只能输入m~n位的数字:"^\d{m,n}$"。
12.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
13.只能输入有两位小数的正实数:"^[0-9] (.[0-9]{2})?$"。
14.只能输入有1~3位小数的正实数:"^[0-9] (.[0-9]{1,3})?$"。
15.只能输入非零的正整数:"^ ?[1-9][0-9]*$"。
16.只能输入非零的负整数:"^-[1-9][]0-9"*$。
17.只能输入长度为3的字符:"^.{3}$"。
18.只能输入由26个英文字母组成的字符串:"^[A-Za-z] $"。
19.只能输入由26个大写英文字母组成的字符串:"^[A-Z] $"。
20.只能输入由26个小写英文字母组成的字符串:"^[a-z] $"。
21.验证是否含有^%&',;=?$"等字符:"[^%&',;=?$x22] "。
22.只能输入汉字:"^[u4e00-u9fa5]{0,}$"。
23.验证URL:"^http://([\w-] .) [\w-] (/[\w-./?%&=]*)?$"。
24.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"10"~"12"。
25.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"、"10"~"29"和“30”~“31”。
26.获取日期正则表达式:\d{4}[年|-|.]\d{1-12}[月|-|.]\d{1-31}日?
评注:可用来匹配大多数年月日信息。
27.匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
28.匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
29.匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
30.匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
31.匹配网址URL的正则表达式:[a-zA-z] ://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
33.匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10 000 开始
34.匹配中国邮政编码:[1-9]\d{5}(?!d)
评注:中国邮政编码为6位数字
35.匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
评注:提取ip地址时有用

如果验证条件更加复杂或者找不到想要的正则式,则可以参考这个地方,自己动手写一个出来:点击打开链接 。不过在使用之前,切记要先用工具测试一下。

 

上边说的是正则表达式,下边就说谓词如何与正则表达式联用。

在上一篇中我们介绍了谓词的语法,当谓词和正则联用时,我们就需要认识两个新的关键字:SELF、MATCHES。

self的意思是指代要验证的字符串本身,matches是一个字符串操作:表示匹配。我们用self matches 正则表达式就可以拼接出一个谓词了。如:

 

// 判断字符串首字符是否为字母
        NSString *string = @"wo";
        // 1、准备正则式
        NSString *regex = @"^[A-Za-z]*$"; // 只能是字母,不区分大小写
        // 2、拼接谓词
        NSPredicate *predicateRe1 = [NSPredicate predicateWithFormat:@"self matches %@", regex];
        // 3、匹配字符串
        BOOL resualt = [predicateRe1 evaluateWithObject:string];
        NSLog(@"匹配结果%d", resualt);

打印的结果是:

 

 

2015-06-17 11:58:23.129 NSPredicate[3183:277528] 匹配结果1

表示字符串符合正则式的要求。

 

系统还给我们提供了一个类,共我们使用正则表达式:NSRegularExpression。这个类非常简单,不做过多描述,大家看下边的例子,进入方法的头文件中可以了解更多用法。

 

 /**NSRegularExpression类和正则表达式联用
         *
         *
         *
         **/
        // 1、创建NSRegularExpression对象并指定正则表达式
        // 由于NSRegularExpression需要一个nserror对象,所以要先创建出来
        NSError *error;
        // 第一个参数是正则表达式,第二个参数是匹配操作的类型(枚举值),第三个是error的地址
        NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regex
                                                                                           options:NSRegularExpressionCaseInsensitive
                                                                                             error:&error];

        // 如果没有错误,则进行正则匹配
        if (!error) {
            NSRange range = NSMakeRange(0, string.length);
            // 第一个参数是要匹配的字符串,第二个参数是匹配操作的类型,第三个是要匹配字符串的范围
            // 建议进入头文件查看其他方法
            NSTextCheckingResult *match = [regularExpression firstMatchInString:string
                                                                        options:NSMatchingReportProgress
                                                                          range:range];
            if (match) {
                NSLog(@"NSRegularExpression匹配成功");
            }
        // 如果发生错误,打印错误类型
        } else {
            NSLog(@"错误类型:%@",error);
        }

打印的结果是:

 

 

2015-06-17 11:58:23.129 NSPredicate[3183:277528] NSRegularExpression匹配成功

 

 

在上一篇中,我们聊了NSPredicate的基本用法:谓...

3.最后就是将符合某正则表达式的字符串进行替换了
- (NSString *)yf_replacingMatchedStringWithPattern:(NSString *)pattern andTemplate:(NSString *)templ { NSError *error = nil; NSRegularExpression *regrex = [NSRegularExpression regularExpressionWithPattern:pattern options:kNilOptions error:&error]; if  return nil; return [regrex stringByReplacingMatchesInString:self options:kNilOptions range:NSMakeRange(0, self.length) withTemplate:templ];}

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

在移动端使用正则表达式的场景, 通常是做一些判断,其主要作用如下:

4. NSRegularExpression类之抓取多个结果

当一个字符串有多个符合特定规则的字符,我们可以分别获取到符合特定规则的字符:

NSString *regex = @"\-\d*\.";
NSString *str = @"-34023242.-34203020.";
NSError *error;
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex
                                                                         options:NSRegularExpressionCaseInsensitive
                                                                           error:&error];
// 对str字符串进行匹配
NSArray *matches = [regular matchesInString:str
                                    options:0
                                      range:NSMakeRange(0, str.length)];
// 遍历匹配后的每一条记录
for (NSTextCheckingResult *match in matches) {
    NSRange range = [match range];
    NSString *mStr = [str substringWithRange:range];
    NSLog(@"%@", mStr);
}
1.先来看判断用户名和密码等是否符合要求
 /* 符合要求的用户名,字母开头,允许5-16字节,允许字母数字下划线 */#define kUserAccountNumberRegrex @"^[a-zA-Z][a-zA-Z0-9_]{4,15}$"

- yf_isLegalAccountNumber { NSPredicate *accountPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",kUserAccountNumberRegrex]; if (![accountPredicate evaluateWithObject:self]) return NO; return YES;}

我先设定一个谓词, 在将谓词进行初始化的时候, 是利用正则表达式语句进行初始化的. 然后在利用evaluateWithObject:这个方法就可以直接判断是否符合条件, 如果是就返回 YES, 不是就返回 NO.

1. 谓词 NSPredicate

// 编写正则表达式:只能是数字或英文,或两者都存在
NSString *regex = @"^[a-z0-9A-Z]*$";
// 创建谓词对象并设定条件的表达式
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
// 判断的字符串
NSString *str = @"Hello100";
// 对字符串进行判断
if ([predicate evaluateWithObject:str]) {
    NSLog(@"Match");
}
其实这些方法中涉及到的关键类就是

NSRegularExpression

我们将利用正则语句初始化一个NSRegularExpression对象, 然后对NSRegularExpression这个类的 API 进行封装, 就得到了这个分类, 在实际开发的过程中, 我们直接对 NSString 对象进行操作, 就十分方便了,下面的链接是源码, 提供给有需要的朋友.拖到工程中,导入头文件即可使用.

源码链接

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

在菜鸟教程中,你可以看到完整的正则表达式的语法和用法, 非常的详细, 所以,这不是本文的重点. 我主要是对正则表达式进行一个封装, 便于我们在实际开发中的使用

可以看到的是, 我们通常是将一个字符串进行正则判断, 要么截取子串, 要么替换子串, 要么判断字符串是否符合某一类型, 那么我们操作最多的也就是字符串了, 所以我们首先建一个 NSString 的分类:

图片 1正则表达式分类

在这个分类中, 我们也主要做以下三件事情

  • 用户输入的用户名,密码等是否符合要求和规范
  • 截取符合某正则表达式的字符串返回
  • 将符合某正则表达式的字符串进行替换

非打印字符

非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:

字符 描述
cx 匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
f 匹配一个换页符。等价于 x0c 和 cL。
n 匹配一个换行符。等价于 x0a 和 cJ。
r 匹配一个回车符。等价于 x0d 和 cM。
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。
S 匹配任何非空白字符。等价于 [^ fnrtv]。
t 匹配一个制表符。等价于 x09 和 cI。
v 匹配一个垂直制表符。等价于 x0b 和 cK。
2.再来看截取符合某正则表达式的字符串返回
  • 返回第一次匹配到的字符串在母串中的位置
- yf_firstMatchRangeWithPattern:(NSString *)pattern { NSError *error = nil; NSRegularExpression *regrex = [NSRegularExpression regularExpressionWithPattern:pattern options:kNilOptions error:&error]; if  return NSMakeRange; return [regrex rangeOfFirstMatchInString:self options:kNilOptions range:NSMakeRange(0, self.length)];}
  • 返回第一次匹配到的字符串
- (NSString *)yf_firstMatchStringWithPattern:(NSString *)pattern { NSRange range = [self yf_firstMatchRangeWithPattern:pattern]; if (range.length == 0) return nil; return [self substringWithRange:range];}
  • 返回匹配到的所有符合要求的字符串个数
- (NSUInteger)yf_numberOfMatchedStringsWithPattern:(NSString *)pattern { NSError *error = nil; NSRegularExpression *regrex = [NSRegularExpression regularExpressionWithPattern:pattern options:kNilOptions error:&error]; return [regrex numberOfMatchesInString:self options:kNilOptions range:NSMakeRange(0, self.length)];}
  • 返回匹配到的所有符合要求的字符串
- (NSArray *)yf_matchedStringsWithPattern:(NSString *)pattern { NSError *error = nil; NSRegularExpression *regrex = [NSRegularExpression regularExpressionWithPattern:pattern options:kNilOptions error:&error]; NSArray<NSTextCheckingResult *> *resultArray = [regrex matchesInString:self options:kNilOptions range:NSMakeRange(0, self.length)]; NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:resultArray.count]; for (NSTextCheckingResult *result in resultArray) { NSString *resultString = [self substringWithRange:result.range]; [tempArray addObject:resultString]; } return tempArray.copy;}

5. NSRegularExpression类替换匹配的字符串

    // 准备对象
    NSString * searchStr = @"ABC[link]登录处理[/link]QWE";
    NSString * regExpStr = @"\[link]|\[/link]";

    NSString * replacement = @"";
    // 创建 NSRegularExpression 对象,匹配 正则表达式
    NSRegularExpression *regExp = [[NSRegularExpression alloc] initWithPattern:regExpStr
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:nil];
    NSString *resultStr = searchStr;
    // 替换匹配的字符串为 searchStr
    resultStr = [regExp stringByReplacingMatchesInString:searchStr
                                                 options:NSMatchingReportProgress
                                                   range:NSMakeRange(0, searchStr.length)
                                            withTemplate:replacement];

// 找到最长的匹配字符串后调用 block 回调
NSMatchingReportProgress         = 1 << 0,    
// 找到任何一个匹配串后都回调一次 block
NSMatchingReportCompletion       = 1 << 1,
// 从匹配范围的开始进行极限匹配
NSMatchingAnchored               = 1 << 2,   
// 允许匹配的范围超出设置的范围
NSMatchingWithTransparentBounds  = 1 << 3,    
// 禁止^和$自动匹配开始和结束
NSMatchingWithoutAnchoringBounds = 1 << 4

3. NSRegularExpression类创建正则表达式

NSString *url = @"111331122@qq.com";
NSError *error;
// 创建NSRegularExpression对象并指定正则表达式
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:@"[^@]*\."
                              options:0
                              error:&error];
if (!error) { // 如果没有错误
    // 获取特特定字符串的范围
    NSTextCheckingResult *match = [regex firstMatchInString:url
                                                    options:0
                                                      range:NSMakeRange(0, [url length])];
    if (match) {
        // 截获特定的字符串
        NSString *result = [url substringWithRange:match.range];
        NSLog(@"%@",result);
    }
} else { // 如果有错误,则把错误打印出来
    NSLog(@"error - %@", error);
}

这个例子是从字符串里检索出以“@”开头“.”结尾的区间字符串,最后检索出来的字符串结尾包括“.”,因此此例子最终输出结果为“qq.”

// 不区分大小写
NSRegularExpressionCaseInsensitive = 1 << 0, 
// 忽略空格和# -
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, 
// 整体化
NSRegularExpressionIgnoreMetacharacters   = 1 << 2, 
// 匹配任何字符,包括行分隔符
NSRegularExpressionDotMatchesLineSeparators   = 1 << 3, 
// 允许^和$匹配开始和结束
NSRegularExpressionAnchorsMatchLines   = 1 << 4, 
// 设置\n为唯一的行分隔符,否则所有的都有效
NSRegularExpressionUseUnixLineSeparators  = 1 << 5 
// 使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
NSRegularExpressionUseUnicodeWordBoundaries   = 1 << 6

常用的正则表达式

   1.验证用户名和密码:”^[a-zA-Z]w{5,15}$”
  2.验证电话号码:(”^([\d{3,4}-)\d{7,8}$](file:///d{3,4}-)//d{7,8}$)”)
  eg:021-68686868  0511-6868686;
  3.验证手机号码:”^1[3|4|5|7|8][0-9]\d{8}$”;
  4.验证身份证号(15位或18位数字):”\d{14}[[0-9],0-9xX]”;
  5.验证Email地址:(“^\w ([- .]\w )*@\w ([-.]\w )*.\w ([-.]\w )*$”);
  6.只能输入由数字和26个英文字母组成的字符串:(“^[A-Za-z0-9] $”) ;
  7.整数或者小数:^[0-9] ([.]{0,1}[0-9] ){0,1}$
  8.只能输入数字:”^[0-9]*$”。
  9.只能输入n位的数字:”^\d{n}$”。
  10.只能输入至少n位的数字:”^\d{n,}$”。
  11.只能输入m~n位的数字:”^\d{m,n}$”。
  12.只能输入零和非零开头的数字:”^(0|[1-9][0-9]*)$”。
  13.只能输入有两位小数的正实数:”^[0-9] (.[0-9]{2})?$”。
  14.只能输入有1~3位小数的正实数:”^[0-9] (.[0-9]{1,3})?$”。
  15.只能输入非零的正整数:”^ ?[1-9][0-9]*$”。
  16.只能输入非零的负整数:”^-[1-9][]0-9″*$。
  17.只能输入长度为3的字符:”^.{3}$”。
  18.只能输入由26个英文字母组成的字符串:”^[A-Za-z] $”。
  19.只能输入由26个大写英文字母组成的字符串:”^[A-Z] $”。
  20.只能输入由26个小写英文字母组成的字符串:”^[a-z] $”。
  21.验证是否含有^%&',;=?$”等字符:”[^%&',;=?$x22] ”。
  22.只能输入汉字:”^[u4e00-u9fa5]{0,}$”。
  23.验证URL:"http(s)?://([\w-] \.) [\w-] (/[\w- ./?%&=]*)?"。
  24.验证一年的12个月:”^(0?[1-9]|1[0-2])$”正确格式为:”01″~”09″和”10″~”12″。
  25.验证一个月的31天:”^((0?[1-9])|((1|2)[0-9])|30|31)$”正确格式为;”01″~”09″、”10″~”29″和“30”~“31”。
  26.获取日期正则表达式:[\d{4](file:///d{4)}[年|-|.]\d{1-12}[月|-|.]\d{1-31}日?
  评注:可用来匹配大多数年月日信息。
  27.匹配双字节字符(包括汉字在内):[^x00-xff]
  评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
  28.匹配空白行的正则表达式:ns*r
  评注:可以用来删除空白行
  29.匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</>|<.*? />
  评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
  30.匹配首尾空白字符的正则表达式:^s*|s*$
  评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
  31.匹配网址URL的正则表达式:[a-zA-z] ://[^s]*
  评注:网上流传的版本功能很有限,上面这个基本可以满足需求
  32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  评注:表单验证时很实用
  33.匹配腾讯QQ号:[1-9][0-9]{4,}
  评注:腾讯QQ号从10 000 开始
  34.匹配中国邮政编码:[1-9]\d{5}(?!d)
  评注:中国邮政编码为6位数字
  35.匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。

iOS中正则表达式的使用方法:

2. NSString实例方法

使用rangeOfString:options:方法可以做到,具体看例子:

NSString *phoneNo = @"123456789";
NSRange range = [phoneNo rangeOfString:@"^1[2]\d{9}$" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
    NSLog(@"%@", [phoneNo substringWithRange:range]);
}

rangeOfString:options:会返回一个NSRange,用来接收匹配的范围,当匹配不到结果时,将会返回一个NSIntegerMax最大值,也就是NSNotFound,因此我们可以用它来判断用户输入的内容是否符合规则。

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

正则表达式的限定符有:

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
匹配前面的子表达式一次或多次。例如,'zo ' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "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} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

*、 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

本文由时时app平台注册网站发布于编程知识,转载请注明出处:iOS开发,谓词(NSPredicate)的用法:(二)谓词和

关键词: