一个例子学会正则表达式

文章以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美学,获取更多有趣的技术

猜你喜欢

转载自blog.csdn.net/bitcser/article/details/105330136