美文网首页
正则表达式

正则表达式

作者: c048e8b8e3d7 | 来源:发表于2016-09-07 19:15 被阅读16次

相关符号

():括号里面的内容作为一个组,类似于一个字符串,例如(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

相关文章

  • Linux命令行与Shell脚本编程大全-shell正则表达式

    本章内容: 定义正则表达式 了解基本正则表达式 扩展正则表达式 创建正则表达式 定义正则表达式 正则表达式是你定义...

  • 正则相关

    正则表达式基本语法 正则表达式常见字符 正则表达式特殊字符 正则表达式数量词 正则表达式边界匹配 正则表达式逻辑或...

  • 正则表达式系列-1

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 什么是正则表达式 正则表达式就是用事先定...

  • 正则表达式

    正则表达式 - 教程正则表达式 - 简介正则表达式 - 语法正则表达式 - 元字符正则表达式 - 运算符优先级正则...

  • Python基础入门 - 正则表达式与综合实战

    1. 初识正则表达式 1.1 介绍 步骤介绍正则表达式入门及应用正则表达式的进阶正则表达式案例 1.2 正则表达式...

  • Java正则表达式参考

    Java正则表达式入门 java正则表达式应用 深入浅出之正则表达式(一) 深入浅出之正则表达式(二) 正则表达式...

  • 正则表达式

    正则表达式 正则表达式就是记录文本规则的代码 正则表达式常用的元字符 正则表达式常用的限定符 正则表达式举例:这里...

  • Python爬虫(十)_正则表达式

    本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规...

  • python正则表达式

    本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规...

  • 正则表达式

    了解正则表达式基本语法 能够使用JavaScript的正则对象 正则表达式简介 什么是正则表达式 正则表达式:用于...

网友评论

      本文标题:正则表达式

      本文链接:https://www.haomeiwen.com/subject/zrajettx.html