正则表达式

2016-09-07  本文已影响16人  c048e8b8e3d7

相关符号

():括号里面的内容作为一个组,类似于一个字符串,例如(abc)需要匹配的是abc.
[]:匹配单个字符,例如[abc]匹配的是'a','b','c'.
[^]:匹配中括号里面字符以外的字符,例如[^abc],除了'a','b','c'不匹配以外,其他字符都匹配.
. 匹配任意字符.例如p.p 匹配pop, p p, p.p, p@p等.
\w:匹配数字字母下划线任一字符,例如a\w匹配aa,a8,a_但不匹配a!.
\d:匹配任意数字字符,等价于[0-9],\d\d?:\d\d为时间格式,匹配9:30,12:23.
\b:匹配单词的边界字符,包含空格和符号,例如to\b匹配to, to the moon, 但是不匹配tomorrow,to!教程上说匹配,但是用参考3的工具测试时不匹配的,待定
\s:匹配空白字符,包含空格,制表,换行,hello\s匹配hello jc里的hello(hello后有个空格),
^:不在中括号里面的时候表示以什么开头
$:表示以什么结尾
*:0次或多次
+:1次或多次
?:0次或1次
{}:表示最大次数和最小次数,例如{1,2}表示最少一次,最多两次,{2,}表示最少两次,最多次数不限

使用示例

1 首先需要创建一个NSRegularExpression的对象

NSError *error = NULL;
NSString *str = @"AABCfaabcf";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"abc" options:NSRegularExpressionCaseInsensitive error:&error];
NSRange range = NSMakeRange(0, str.length);
if (error) {
    NSLog(@"error : %@", error);
    return;
}

2 查看匹配情况

    //******    匹配数量        *******
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:str options:0 range:range];
    //匹配的数量 输出 2
    NSLog(@"numberOfMatches is %lu", (unsigned long)numberOfMatches);
    
    //******    第一个匹配        *******
    NSRange firstRange = [regex rangeOfFirstMatchInString:str options:0 range:range];
    if (firstRange.location != NSNotFound) {
        NSString *firstRangeStr = [str substringWithRange:firstRange];
        //打印 ABC
        NSLog(@"firstRangeStr is %@", firstRangeStr);
    }

    //******    第一个匹配        *******
    NSTextCheckingResult *result = [regex firstMatchInString:str options:0 range:range];
    if (result) {
        NSString *firstRangeStr = [str substringWithRange:firstRange];
        //打印 ABC
        NSLog(@"firstMatchInString is %@", firstRangeStr);
    }
    
    //如果没有任何匹配的数据,则range.location = NSNotFound
    //可以根据这个值来判断是否有匹配的数据
    NSString *notfoundStr = @"test";
    NSRange notfoundRange = [regex rangeOfFirstMatchInString:notfoundStr options:0 range:NSMakeRange(0, notfoundStr.length)];
    if (notfoundRange.location == NSNotFound) {
        NSLog(@"没有对应的数据");
    }
    
    //******    所有匹配        *******
    NSArray *matches = [regex matchesInString:str options:0 range:range];
    for (NSTextCheckingResult *match in matches) {
        NSRange matchRange = match.range;
        NSString *rangeStr = [str substringWithRange:matchRange];
        NSLog(@"rangeStr is %@", rangeStr);
    }
    
    //******    枚举匹配        *******
    __block NSUInteger count = 0;
    [regex enumerateMatchesInString:str options:0 range:range usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
        NSRange matchRange = result.range;
        NSLog(@"enumerate match %@", [str substringWithRange:matchRange]);
        
        //下面这句话表示匹配数量有一个的时候,就跳出这个枚举
        if (++count >= 1) {
            *stop = YES;
        }
    }];

3 查找并替换

//如果需要部分替换,则需要修改range的范围
    NSString *modifiedString = [regex stringByReplacingMatchesInString:str options:0 range:range withTemplate:@"JC"];
    //原来AABCfaabcf
    //完成AJCfaJCf
    NSLog(@"modifiedString is %@", modifiedString);
    
    //原来AABCfaabcf
    //完成CJH
    NSString *replaceCheckingResultString = [regex replacementStringForResult:matches.firstObject inString:str offset:0 template:@"CJH"];
    NSLog(@"replaceCheckingResultString is %@", replaceCheckingResultString);
    
    //替换的次数
    NSUInteger replaceCount = [regex replaceMatchesInString:[str mutableCopy] options:0 range:range withTemplate:@"JC"];
    NSLog(@"replaceCount is %lu", (unsigned long)replaceCount);

技巧

1 去除输入字符串中前面和后面的空格,有时候用户可能在开始输入的时候打了一个空格但用户自己并没有发现

// Trim the input string by removing leading and trailing white spaces
// and return the result
- (NSString *)stringTrimmedForLeadingAndTrailingWhiteSpacesFromString:(NSString *)string
{
    NSString *leadingTrailingWhiteSpacesPattern = @"(?:^\\s+)|(?:\\s+$)";
    
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:leadingTrailingWhiteSpacesPattern options:NSRegularExpressionCaseInsensitive error:NULL];
    
    NSRange stringRange = NSMakeRange(0, string.length);
    NSString *trimmedString = [regex stringByReplacingMatchesInString:string options:NSMatchingReportProgress range:stringRange withTemplate:@"$1"];
    
    return trimmedString;
}

参考

  1. 官方文档
  2. raywenderlich教程
  3. 在线检测
  4. ICU正则表达式规范
  5. regular-expressions
上一篇 下一篇

猜你喜欢

热点阅读