iOS 和Android中的正则表达式简单使用
ios 中需要使用NSRegularExpression类,NSTextCheckingResult类。
下面给出最基本的实现代码
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(a.*)(b)" options:NSRegularExpressionCaseInsensitive error:nil]; __block NSUInteger count = 0; NSString *string = @" ab ab ab "; [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ NSLog(@"---------------------------find one match!"); NSRange matchRange = [match range]; NSRange firstHalfRange = [match rangeAtIndex:1]; NSRange secondHalfRange = [match rangeAtIndex:2]; NSLog(@"the string is %@",[string substringWithRange:matchRange]); NSLog(@"firstHalfRange is %@",[string substringWithRange:firstHalfRange]); NSLog(@"secondHalfRange is %@",[string substringWithRange:secondHalfRange]); if (++count >= 100) *stop = YES; }];
它的结果如下
这里每个rang的含义如下,matchRange表示找到的每个匹配串的总体位置,firstHalfRange则表示第一个表达式(a.*)的匹配范围,当然这个范围是总范围的一部分。关于为什么匹配到 "ab ab ab" 而不是 ab,这根据系统的处理方法而定,可能有方法进行设定,没有研究过。
如果仅仅想处理第一个匹配的结果,那么可以使用以下的代码,这种比较常用
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; if (match) { NSRange matchRange = [match range]; NSRange firstHalfRange = [match rangeAtIndex:1]; NSRange secondHalfRange = [match rangeAtIndex:2]; } }
需要注意, ios的字符串由于存在转义字符\, 所以 \b 要写成 \\b, 还有当需要使用+ . 这种已经被定义为特殊含义的符号时, 也需要进行转义 \\+ \\.
正则表达式中*的使用小注意
今天要匹配"/Date(1407785755000)/"中的数字,我用了"\\d*" ,之后匹配到了结果,但是结果的range是(0,0)。其实,应该使用
"\\d+",以后单独使用*时要多多注意,*可以代表0个,所以就是"\\d*"可以代表空字符串。
正则表达式里"-"中划线的使用注意
今天要匹配正则表达式,把非法的字符找出来,开始的写法是这个
[^A-Za-z0-9_.*-+%!],我的目的是把_.*-+%!这7个字符算合法字符,但是发现有许多其他字符也合法了,原来是中划线的位置不对,应该这样写
[^A-Za-z0-9_.*+%!-],在中间放的中划线会被识别为连接符,表示一个范围。
Android中需要使用Pattern 和Matcher2个类,其实和ios的基本思路是一致的!
String patternStr = "[0-9:]*"; Pattern p = Pattern.compile(patternStr); Matcher m = p.matcher(originalStr); if (m.find()) { returnStr = m.group(0); }