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

275 阅读3分钟

#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,并捕获文本到自动命名的组里
(?exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置

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

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

如果喜欢,请别害羞