文章以OC为例,正则表达式不分语言,文章中的规则在别的语言也是通用的。
最近有个需求是在字符串中匹配出特殊的字符串,格式是<at open_id="" user_id="">昵称</at>
我写出来的正则如下:
NSString *Regex =@"<at open_id=\"\\w{16}\" user_id=\"\\w{32}\">.{1,10}</at>";
一步一步分析,前半段格式是固定的为:<at open_id=\"\" 由于open_id的值为16位数字或者字母,\w就是代表数字或者字母,所以使用\w{16}
"\"在iOS里需要转义,所以多一个\
这样,同理也就写出了user_id限制是32位
然后是昵称,可能是1-10位之间都要匹配上,使用.{1,10},其中"."代表所有字符均可
这样就写出来了完整的表达式
测试代码:
NSString *str = @"你好瘦猪 <at open_id=\"02PZgYL03okoqnjE\" user_id=\"bf94c94235d311ea9c80acde48001122\">瘦猪</at>你好胖猴<at open_id=\"02PZgYL03okoqnjE\" user_id=\"bf94c94235d311ea9c80acde48001122\">胖猴</at>";
方法:
NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:Regex
options:NSRegularExpressionCaseInsensitive
error:&error];
// 执行匹配的过程
NSArray *matches = [regex matchesInString:str
options:NSMatchingReportCompletion
range:NSMakeRange(0, [str length])];
for (NSTextCheckingResult *match in matches) {
NSLog(@"%@",[str substringWithRange:match.range]);
}
结果:
matches里有两个元素,打印出来之后是正确的位置。
看到这基本就能写简单的正则表达式了。
更多规则如下:
特殊符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束,如果从整个字符串中找子字符串,不用这两个规则,如果是判断完整字符串是否符合规则,才会用。
匹配任意字符:.
匹配字母和数字: \w
匹配数字:\d
匹配空白字符:\s
“ab*”:表示一个字符串有一个a后面跟着零个或若干个b(”a”, “ab”, “abbb”,……);
“ab+”:表示一个字符串有一个a后面跟着至少一个b或者更多( ”ab”, “abbb”,……);
“ab?”:表示一个字符串有一个a后面跟着零个或者一个b( ”a”, “ab”);
“a?b+$”:表示在字符串的末尾有零个或一个a跟着一个或几个b( ”b”, “ab”,”bb”,”abb”,……)。
“ab{4}”:表示一个字符串有一个a跟着4个b(”abbbb”);
“ab{1,}”:表示一个字符串有一个a跟着至少1个b(”ab”,”abb”,”abbb”,……);
“ab{3,4}”:表示一个字符串有一个a跟着3到4个b(”abbb”,”abbbb”)。
那么“*”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示;
“ | ”表示“或”操作,初中毕业的都知道;
“a|b”:表示一个字符串里有”a”或者”b”;
“(a|bcd)ef”:表示”aef”或”bcdef”;
“(a|b)*c”:表示一串”a”"b”混合的字符串后面跟一个”c”;
方括号”[ ]“表示在括号内的众多字符要符合的条件,如下:
“[a-d]“:表示一个字符串包含小写的'a'到'd'中的一个(相当于”a|b|c|d”或者”[abcd]“);
“^[a-zA-Z]“:表示一个以字母开头的字符串;
“[0-9]a”:表示a前有一位的数字;
备注:
上面的例子,是使用正则表达式类(NSRegularExpression),会返回数组。
此方法会返回第一个符合的子串的位置信息:
获取完整字符串中,符合正则表达式规则的子字符串位置:
NSRange range = [str rangeOfString:Regex options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
NSLog(@"range :%@", [str substringWithRange:range]);
}
判断完整字符串是否符合正则表达式方法,返回bool值:
- (BOOL)validateNumber:(NSString *) textString
{
NSString* number=@"^[0-9]+$";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
return [numberPre evaluateWithObject:textString];
}
关注公众号IT美学,获取更多有趣的技术