iOS 正则表达式使用(转)

1/ 教程一:认识正则表达式 。 http://deerchao.net/tutorials/regex/regex.htm#mission

  1.  

 

表7.尚未详细讨论的语法
代码/语法说明
\a 报警字符(打印它的效果是电脑嘀一声)
\b 通常是单词分界位置,但如果在字符类里使用代表退格
\t 制表符,Tab
\r 回车
\v 竖向制表符
\f 换页符
\n 换行符
\e Escape
\0nn ASCII代码中八进制代码为nn的字符
\xnn ASCII代码中十六进制代码为nn的字符
\unnnn Unicode代码中十六进制代码为nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开头(类似^,但不受处理多行选项的影响)
\Z 字符串结尾或行尾(不受处理多行选项的影响)
\z 字符串结尾(类似$,但不受处理多行选项的影响)
\G 当前搜索的开头
\p{name} Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp) 贪婪子表达式
(?<x>-<y>exp) 平衡组
(?im-nsx:exp) 在子表达式exp中改变处理选项
(?im-nsx) 为表达式后面的部分改变处理选项
(?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes) 同上,只是使用空表达式作为no
(?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes) 同上,只是使用空表达式作为no

 

正则表达式模式

 

模式字符串使用特殊的语法来表示一个正则表达式:

 

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

 

多数字母和数字前加一个反斜杠时会拥有不同的含义。

 

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

 

反斜杠本身需要使用反斜杠转义。

 

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 '\\t')匹配相应的特殊字符。

 

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

 

模式描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}  
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

 


 

正则表达式实例

 

字符匹配

 

实例描述
python 匹配 "python".

 

字符类

 

实例描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

 

特殊字符类

 

实例描述
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

 

 

验证数字:^[0-9]*$

验证n位的数字:^\d{n}$

验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$
验证零和非零开头的数字:^(0|[1-9][0-9]*)$
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证非零的正整数:^\+?[1-9][0-9]*$
验证非零的负整数:^\-[1-9][0-9]*$
验证非负整数(正整数 + 0) ^\d+$
验证非正整数(负整数 + 0) ^((-\d+)|(0+))$
验证长度为3的字符:^.{3}$
验证由26个英文字母组成的字符串:^[A-Za-z]+$
验证由26个大写英文字母组成的字符串:^[A-Z]+$
验证由26个小写英文字母组成的字符串:^[a-z]+$
验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
验证由数字、26个英文字母或者下划线组成的字符串:^\w+$
验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+
验证汉字:^[\u4e00-\u9fa5],{0,}$
验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
验证电话号码:^(\d3,4|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
验证身份证号(15位或18位数字):^\d{15}|\d{}18$
验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。
整数:^-?\d+$
非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数 ^(-?\d+)(\.\d+)?$
转自:http://www.cnblogs.com/lemontree/archive/2009/03/01/1401080.html

网上的资源及本文参考文献

iOS 开发中使用正则表达式匹配并替换对应字符

  今天在写一个项目的时候用到了正则表达式;将正则表达式与字典中的 key 进行匹配,并将匹配到的字符串用 key 对应的 value 来替换.

  记得之前看到过一篇文章名字好像是"懂十句正则表达式,少写 1k 行代码",好像是这个名字,记不大清了;其实一点不为过,正则表达式确实有其方便之处;但是初一看正则表达式----数以亿计只可爱的羊驼奔腾不息----有没有????有没有????有没有????

  当然,这里说笑了.正则表达式语法看起来好像很复杂,其实简单的使用也没有太复杂的;其语法在这里不赘述了,大家可以看下这两篇文章 文章一 文章二;

  在我们 iOS 开发中,苹果也为我们提供了对应的方法和类来方便我们在开发中使用正则表达式就是NSRegularExpression这个类;

  下面是我在写项目时用到的几个方法,写了一个 Demo

Edit:今天在优化代码的时候,发现了一个更加简单的方法,写在下面,第二种方法;

--------------方法一----------------------

下面我们直接入正题:

1. 首先我们要创建一个NSRegularExpression的对象,这里系统提供了两种方法,一个类方法,一个构造方法;

+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
  下面说下这里面的几个参数:

pattern:这个参数就是要匹配的正则表达式;
options:这个参数表示匹配类型,很明显这是一个枚举;另外这个枚举是一个位枚举,可以同时启用多个,以按位或|连接;
// 不区分大小写
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
error:为错误信息,可以返回错误信息,如果需要抓取这个错误的话可以给一个 NSError 对象的地址,一般情况可以直接给一个 nil;
2. 接下来就要开始进行替换了,就是用下面这个方法,这个方法的返回值是一个替换完成后的字符串;

- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
  再来说说这里的几个参数:

string:需要正则表达式去匹配的字符;
option这里也是一个枚举,同样这里也是一个位枚举,同法同上样这里我就不多写
// 找到最长的匹配字符串后调用 block 回调
NSMatchingReportProgress         = 1 << 0,    
// 找到任何一个匹配串后都回调一次 block
NSMatchingReportCompletion       = 1 << 1,
// 从匹配范围的开始进行极限匹配
NSMatchingAnchored               = 1 << 2,   
// 允许匹配的范围超出设置的范围
NSMatchingWithTransparentBounds  = 1 << 3,    
// 禁止^和$自动匹配开始和结束
NSMatchingWithoutAnchoringBounds = 1 << 4
range:匹配范围,这里可以直接给一个(0, string.length),就是在整个字符串范内配;
templ:需要替换的字串;
3. 上面将要用到的两个方法介绍了一下,接下来进入主题------->上代码:

// 准备对象
NSString * searchStr = @"LOOK239832LOOK";
NSString * regExpStr = @"[0-9A-Z].";
NSString * replacement = @"ha";
// 创建 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];
NSLog(@"\\nsearchStr = %@\\nresultStr = %@",searchStr,resultStr);
4.运行结果


result image
--------------方法二----------------------

今天在优化代码的时候,发现了一个 NSString 的方法也是可以做这种正则表达式的匹配的,下面补上代码:

// 准备对象
NSString *orginalString = @",0,f,m,b";
NSString *regExpString  = @",[01]";
NSString *template      = @"";

for (NSInteger i = 0; i < 10; i++) {
NSString *result =
        [orginalString stringByReplacingOccurrencesOfString:regExpString
                                                 withString:template
                                                    options:NSRegularExpressionSearch // 注意里要选择这个枚举项,这个是用来匹配正则表达式的
                                                      range:NSMakeRange (0, orginalString.length)];
        NSLog (@"\nsearchStr = %@\nresultStr = %@", orginalString, result);
    }
结果也是一样的能替换,下面来看一下:


second_mothed_result
&esmp;&esmp;这里面有一个枚举项,如果是用于匹配正则表达式的话,一定要选 NSRegularExpressionSearch,不然的话,就是将正则表达式以字符串的形势去替换,而不是去匹配替换,请务必注意这点;

 

posted @ 2017-03-28 09:04  徐家汇  阅读(408)  评论(0编辑  收藏  举报