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。