
timg.jpg
写在前面
一直在用正则表达式,基本上都是匹配国内手机号码、邮箱等,近期需要匹配其他国家电话、邮箱,正好自己研究一下正则表达式。
正则表达式由原意字符和元字符构成(原意字符表达字符原有意思,元字符则表达规定的特殊意义)
示例:^[0-9]+$
上面就是一个完整的正则表达式,表示 一个只能由0到9(包含0和9)的数字 组成的至少一位的字符串,下面我们就来一起看一下正则表达式的基本用法。
语法
正则语法中最基础的表达式符号有以下四个
| ^ | $ | ** . ** | [ ] |
|---|---|---|---|
| 指定字符串开头 | 指定字符串结尾 | 除 \r\n以外的 通配符 | 包含[]内的任意一个字符(至少1个) |
(\r :回车; \n:换行 )
^one表示一个以“abc”开始的字符串("one people","one dog");
类似于-(BOOL) hasPrefix:(NSString *) astring;
-
dog$:表示所以以”dog”结尾的字符串("a good dog","a bad dog");
类似于:- (BOOL)hasSuffix:(NSString *) aString; -
^iPhone&表示有且只有这一个不重复的字段,
相当于== -
originalCharactor单纯的原意字符表示包含该字符串,
相当于- (BOOL)containsString:(NSString *) aString, - "." 也就是“点”,匹配任何单个字符(不包括回车换行)
1.a1后面跟任意一个字符再跟一个a("1Qa","1@a","12a") -
[ab]字符串中有一个a或b ("a","b") __ 注意区分 __^[ab]$这是一个为"a"或"b"的字符串
[a-d]:表示一个字符串包含小写的'a'到'd'中的一个;
^[a-zA-Z]:表示一个以字母开头的字符串;
[0-9]a:表示a前有一位的数字;
[a-zA-Z0-9]$:表示一个字符串以一个字母或数字结束。
| { } | * | + | ? |
|---|---|---|---|
| {}前一字符出现次数由{}内数字决定 | *前一字符出现 0-N次 | +前一字符出现1-N次 | ?前一字符出现0-1次 |
( ) 域段:可与其他字符结合使用,表示()内整个区域为一个整体
{}设置"{}"前一字符重复的具体范围。例如:
“ab{4}”:字符串包含“一个a跟着4个b”(”abbbb”);
“ab{1,}”:字符串包含“一个a跟着至少1个b”(”ab”,”abb”,”abbb”,……);
“ab{2,5}”:表示一个字符串有一个a跟着2到5个b(”abb”,"abbb",”abbbb”,"abbbbb")。
-
ab*:字符串包含“一个a后面跟着0-N个b”("a", "ab", "abbb",……); -
ab+:字符串包含“一个a后面跟着1-N个b”( "ab", "abbb",……); -
ab?:字符串包含“一个a后面跟着0-1个b”( ”a”, “ab”); -
1(abc)*:字符串包含“1后跟着0个或若干个 abc ”("1","1abc","1abcabc",......);
可以看出,*等价于{0,},+等价于{1,},?等价于{0,1}
注:{}内可以没有上限,但是不能没有下限!例如“ab{,5}”是错误的写法
等价
由上文可以看出,在正则表达式中有些东西是等价的,等价是正则表达式中的重要概念,也是让初学者一脸懵逼的存在,但如果将等价恢复成原有语法记忆就比较简单了。
?,*,+,\d,\w 都是等价字符
“ | ”表示“或”操作,在[]内第一位使用用'^'表示匹配除[]内的其他字符
?等价于匹配长度{0,1}
*等价于匹配长度{0,}
+等价于匹配长度{1,}
\d等价于[0-9]
\D等价于[^0-9] :匹配一个非数字字符("aabbcd","@#$abcd")
\w等价于[A-Za-z_0-9]
\W等价于[^A-Za-z_0-9] :匹配 非字母数字 的字符
常用正则表达式
- 匹配国内手机号 :
正则表达式^1[3,4,5,7,8][0-9]{9}$(13/14/15/17/18开头,11位)
iOS语法
-(BOOL) validatePhoneNum:(NSString *) phoneNum { NSString *phoneRegex = @"^1[3,4,5,7,8][0-9]{9}$"; NSPredicate *phonePre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex]; return [phonePre evaluateWithObject:phoneNum]; }
-
匹配邮箱:
正则表达式^[\w.%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$
iOS语法 参考手机号 - 匹配QQ号码:
^[1-9][0-9]{4,14}$(5~15位,不能以0开头,只能是数字) - 匹配身份证:
(^[0-9]{15}$)|([0-9]{17}[0-9X]$)(15位或18位身份证,18位身份证末位可能为X)