iOS开发-正则表达式

来源:互联网 发布:ps mac中文破解版下载 编辑:程序博客网 时间:2024/05/21 09:41

iOS 正则表达式

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

  1. 系统自带的, 如: NSPredicate, rangeOfString:option, NSRegularExpression
  2. RegexKitLite RegexKitLite 是一个轻量级的 Objective-C 的正则表达式库,支持 Mac OS X 和 iOS,使用 ICU 库开发。

至于RegexKitLite, 这里不做介绍。着重介绍系统自带的那几个办法。

PS: 阅读本文前提是您已经掌握了正则基本语法, 如果对正则还不太了解, 可以参考以下几个链接:

正则表达式学习链接:

  1. 55分钟学会正则表达式
  2. 揭开正则表达式的神秘面纱
  3. RegExLib.com(正则表达式库查询)

1. NSPredicate

简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取。

<code class="language-objc hljs r has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">NSPredicate *predicate = [NSPredicate predicateWithFormat:(NSString *), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

其中, 常见的Format有:

(1) 比较运算符: >, <, ==, >=, <=, !=

例:@"number > 100"

(2) 范围运算符: IN, BETWEEN

例:@"number BETWEEN {1,5}"   @"address IN {'shanghai','beijing'}"

(3) 字符串本身: SELF 

例:@“SELF == ‘APPLE’"

(4) 字符串相关: BEGINSWITH, ENDSWITH, CONTAINS

例:@"name CONTAINS[cd] 'ang'"  //包含某个字符串   @"name BEGINSWITH[c] 'sh'"  //以某个字符串开头   @"name ENDSWITH[d] 'ang'"   //以某个字符串结束注:[c]不区分大小写   [d]不区分发音符号即没有重音符号   [cd]既不区分大小写,也不区分发音符号。

(5) 通配符: LIKE

例:@"name LIKE[cd] '*er*'"    //*代表通配符,Like也接受[cd].   @"name LIKE[cd] '???er*'"

(6) 正则表达式: MATCHES

例:NSString *regex = @"^A.+e$";   //以A开头,e结尾  @"name MATCHES %@",regex

至于如何使用呢? 下面举几个例子:

(a) 对NSArray进行过滤, 帅选出包含”ang”的项

<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *array = [[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> alloc]initWithObjects:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"beijing"</span>, @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"shanghai"</span>, @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"guangzou"</span>, @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"wuhan"</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>];    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *string = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ang"</span>;    NSPredicate *pred = [NSPredicate predicateWithFormat:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"SELF CONTAINS %@"</span>, string];    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>, [array filteredArrayUsingPredicate:pred]);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//    打印结果:</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//    (</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//     shanghai,</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//     guangzou</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//    )</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

(b) 对NSDate进行筛选

<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//日期在十天之内:</span>    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *endDate = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> date];    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSTimeInterval</span> timeInterval= [endDate timeIntervalSinceReferenceDate];    timeInterval -=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3600</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>;    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *beginDate = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> dateWithTimeIntervalSinceReferenceDate:timeInterval];    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//对coredata进行筛选(假设有fetchRequest)</span>    NSPredicate *predicate_date = [NSPredicate predicateWithFormat:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"date >= %@ AND date <= %@"</span>, beginDate,endDate];    [fetchRequest setPredicate:predicate_date];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

OK, NSPredicate的功能很多, 也很强大。这里暂时就点到此, 感兴趣的可以自己一一试验。 下面举两个例子说明一下如何使用正则。

<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判断是否是有效邮箱</span>- (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)isValidateEmail:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *)email{    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *regex = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"</span>;    NSPredicate *predicate = [NSPredicate predicateWithFormat:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"SELF MATCHES %@"</span>, regex];    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [predicate evaluateWithObject:email];}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判断字符串首字母是否为字母</span>- (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)isStartedWithWord:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *)aString{    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *regex = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"[A-Za-z]+"</span>;    NSPredicate *predicate = [NSPredicate predicateWithFormat:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"SELF MATCHES %@"</span>, regex];    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [predicate evaluateWithObject:aString];}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

2. 利用rangeOfString:option:直接查找

<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *searchText = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"// Do any additional setup after loading the view, typically from a nib."</span>;    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSRange</span> range = [searchText rangeOfString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(?:[^,])*\\."</span> options:NSRegularExpressionSearch];    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (range<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.location</span> != <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSNotFound</span>) {        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>, [searchText substringWithRange:range]);    }<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//    打印结果:</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//      typically from a nib.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

options中设定NSRegularExpressionSearch就是表示利用正则表达式匹配,会返回第一个匹配结果的位置。


3. 使用正则表达式类

详细了解:  iOS 正则表达式 NSRegularExpression

上面那篇文章总结的很不错. 这里简单再举个例子:

<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *searchText = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"// Do any additional setup after loading the view, typically from a nib."</span>;        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSError</span> *error = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>;    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(?:[^,])*\\."</span> options:NSRegularExpressionCaseInsensitive error:&error];    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> range:NSMakeRange(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, [searchText length])];    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (result) {        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@\n"</span>, [searchText substringWithRange:result<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.range</span>]);    }<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//    打印结果:</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//      typically from a nib.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

使用系统的正则表达式类(NSRegularExpression)会返回匹配的多个结果。


针对以上3种方式, 做一个小小总结

第一种匹配需要学习NSPredicate的写法,需要查阅苹果相关技术文档;

如果只关心第一个匹配的结果,第二种匹配较为简洁;

如果需要匹配多个结果,同时匹配多次,第三种方式效率会更高。

常用正则表达式

参考:  IOS常用正则表达式

表达式作用[\u4e00-\u9fa5]匹配中文字符[^\x00-\xff]匹配双字节字符(包括汉字在内)\n\s*\r匹配空白行<(\S*?)[^>]*>.*?|<.*? />匹配HTML标记^\s*|\s*$匹配首尾空白字符\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*匹配Email地[a-zA-z]+://[^\s]*匹配网址URL\d{3}-\d{8}|\d{4}-\d{7}匹配国内电话号码,匹配形式如 0511-4405222 或 021-87888822[1-9]\d{5}(?!\d)匹配中国邮政编码\d+.\d+.\d+.\d+匹配ip地址
0 0
原创粉丝点击