iOS-开发#iOS#HeminWon

iOS中正则表达式使用及关键语法

2016-10-09  本文已影响53人  山水域

iOS中高效使用正则表达式

代码示例展示

//密码的限制字符
      NSString *passwordStandard = @"^[A-Za-z0-9_-]+$";
       
       NSRegularExpression *regexpasswordStandard = [NSRegularExpression regularExpressionWithPattern:passwordStandard options:0 error:nil];
       
       NSTextCheckingResult *isMatchpasswordStandard = [regexpasswordStandard firstMatchInString:self.passWord.text options:0 range:NSMakeRange(0, [self.passWord.text length])];
       
       if (!isMatchpasswordStandard) {
           //进入 则表示不符合限制要求;
           UIAlertView *alter =[[UIAlertView alloc]initWithTitle:@"密码不能包含特殊字符" message:@"请重新输入密码" delegate:self cancelButtonTitle:@"确认" otherButtonTitles: nil];
           [alter show];
           
           return;
       }

常用的表达式

说明  正则表达式

网址(URL):    [a-zA-z]+://[^\s]*
IP地址(IP Address)    :((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
电子邮件(Email)   : \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
QQ号码    :[1-9]\d{4,}
HTML标记(包含内容或自闭合)    :<(.*)(.*)>.*<\/\1>|<(.*) \/>
密码(由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上) :(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$
日期(年-月-日)   :(\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))
日期(月/日/年)   :((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2})
时间(小时:分钟, 24小时制)      : ((1|0?)[0-9]|2[0-3]):([0-5][0-9])
汉字(字符) :    [\u4e00-\u9fa5]
中文及全角标点符号(字符) : [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee]
中国大陆固定电话号码  :(\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆手机号码    :1\d{10}
中国大陆邮政编码    :[1-9]\d{5}
中国大陆身份证号 :(15位或18位) \d{15}(\d\d[0-9xX])?
非负整数(正整数或零) :\d+
正整数 :[0-9]*[1-9][0-9]*
负整数 :-[0-9]*[1-9][0-9]*
整数  :   -?\d+
小数  :   (-?\d+)(\.\d+)?
不包含abc的单词   :\b((?!abc)\w)+\b

正则表达式的关键语法

代码 说明
“\b” :是正则表达式规定的一个特殊代码(元字符),代表着单词的开头或结尾,也就是单词的分界处。 例:\bhi\b hi 这个单词;
“.” :个元字符,匹配除了换行符以外的任意字符
“ * ” :同样是元字符,它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。
“ .* “ 连在一起就意味着任意数量的不包含换行的字符。
0\d\d-\d\d\d\d\d\d\d\d匹配这样的字符串 :以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码。当然,这个例子只能匹配区号为3位的情形);这里的\d是个新的元字符,匹配一位数字 。也可以这样写这个表达式:0\d{2}-\d{8}。
“ \s ” :匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
“ \w ” :匹配字母或数字或下划线或汉字等。

表1.常用的元字符

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

字符转义
如果你想查找元字符本身的话,需要用到” \ ”;

重复

表2.常用的限定符

代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

更复杂的表达式:(?0\d{2}[) -]?\d{8}
“(”和“)”也是元字符,后面的分组节里会提到,所以在这里需要使用转义。

这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。

分枝条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用“ | ”把不同的规则分隔开。

匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

分组

想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。

反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:

表3.常用的反义代码

代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

例子:

代码/语法 说明
\S+ 匹配不包含空白符的字符串。
<a[^>]+> 匹配用尖括号括起来的以a开头的字符串。

表4.常用分组语法

代码/语法 说明
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

未完待续 ~~~

零宽断言
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。

如果喜欢,请别害羞
上一篇下一篇

猜你喜欢

热点阅读