最近正好有点空余时间,然后就对正则表达式深入研究了一下。
首先,什么是正则表达式呢?
正则表达式,又称郑则表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。它可以迅速地用极简单的方式达到字符串的复杂控制。
首先看一个正则表达式的例子在iOS中的应用,匹配账号(英文+数字+6-10位),看下面这段代码
NSString *name = @"a123fds23";
NSString *regex = @"^[A-Za-z0-9]{6,10}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if (![pred evaluateWithObject:name])
{
NSLog(@"账号错误");
return YES;
}
OK,其中@"^[A-Za-z0-9]{6,10}$"
就是一个正则表达式,看起来是不是很怪异,现在,来分析一下:
1、它代表匹配包含a-z、A-Z、0-9这些字母的6-10位的字符串,如果有其他类似'@'、'#'之类的字符,匹配就出错了,后面{6,10}表示6-10位数字或字母
2、上面字符串中,^
,$
这两个符号,前面一个代表着开始,后面一个代表结束~举个栗子
* "^Kellen" 代表以Kellen开始的字符串,eg:"Kellen123"、"Kellen s22"
* "Kellen$" 代表以Kellen结束的字符串,eg:"111Kellen"、"2sd Kellen"
* "^Kellen$" 它代表了唯一的一个字符串"Kellen"
* "Kellen" 它代表了只要包含"Kellen"字符串的就行,eg:"Kellen s22"、"2sd Kellen"、"123 Kellen 1s"
* [a]表示1-N个括号内符合的字符作为结果,[a]表示包含一个a的字符串,注意,这里没有加重复,所以只是匹配一个,如果加了{},如[a]{2},则表示匹配两个a eg:2aad
* [ab]表示一个字符串有a或者b
* [a-z]表示可以匹配a-z中的任一字符,同理A-Z、0-9
* a{2} 表示匹配两个a eg:2aad
* ab{2,3} 表示一个字符串中a后面有2个或者3个b
* ab{1,}表示一个字符串中a后面有1-...个b,eg:"ab"、"abb"、"abbb"...
* 特殊:*
表示{0,} eg:ab* = ab{0,} a后面有0个或者多个b
* +
表示{1,} eg: ab+ = ab{1,}
* ?
表示{0,1} eg: ab? = ab{0,1} --> a、ab
* 注意,{}中可以没有下限,但不能没有上限,即前面一定要写,后面可有可无,你可以这样理解,zb{,5}不可能会有-2个b吧..._
* "|" 或,a|b 表示一个a或者一个b
* (a|bsd)e 表示asde或者bsde
* "."匹配除了"\r","\n"之外的任一字符 eg:.{2}表示两个随机字符
* "kellen\3" 表示"\3"之前的字符出现的重复次数 "kellennn"
* 如果放在[]中,比如[a-f]表示该字符不能是a-f中的任一
* "\d" = [0,9]
* "\D" = [^0-9]
* 正则表达式中碰到转移字符,应该加一个''
现在来说说正则表达式的常用情形:
- 验证用户名或者密码 : @"^[a-zA-Z0-9]{6-10}$"
- 手机号码验证 : @"((13[0-9])|(15[4,\d])|(18[0,0-9]))\d{8}$"
- 字符串仅能是中文: @"^[u4e00-u9fa5]{0,}$"
- 由数字、26个英文字母或下划线组成的字符串: @"^w+$
"