【问题标题】:Objective-C NSRegularExpressions, finding first occurrence of numbers in a stringObjective-C NSRegularExpressions,查找字符串中第一次出现的数字
【发布时间】:2012-10-17 01:09:08
【问题描述】:

我很擅长使用 Objective-C 的正则表达式。我遇到了一些困难。

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b([1-9]+)\\b" options:NSRegularExpressionCaseInsensitive error:&regError];
if (regError) {
    NSLog(@"%@",regError.localizedDescription);
}
__block NSString *foundModel = nil;
[regex enumerateMatchesInString:self.model options:kNilOptions range:NSMakeRange(0, [self.model length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {
    foundModel = [self.model substringWithRange:[match rangeAtIndex:0]];
    *stop = YES;
}];

我要做的就是获取一个类似的字符串

150A

得到

150

【问题讨论】:

    标签: objective-c ios regex cocoa nsregularexpression


    【解决方案1】:

    .*?(\d+).*? 呢?

    Demo: 这将反向引用该数字,您可以在任何地方使用它。

    【讨论】:

    • 抱歉,这不起作用,因为 * 进行 最长 匹配,因此对于输入 150A,第一个 .* 匹配 15,@ 987654327@ 匹配 0,最后的 .* 匹配 A
    • 对不起,我忘记了“懒惰”的标志
    • 是的,shortest 匹配就可以了,但你肯定只需要第一个吗? (当然还有其他的 re 也可以做到这一点,但是像@Joe 这样的模式只匹配所需的数字,这是好的。)
    【解决方案2】:

    首先是正则表达式的问题:

    1. 您正在使用单词边界 (\b),这意味着您只有 寻找一个单独的数字(例如 15 但不是 150A)。
    2. 您的号码范围不包括0,因此它不会捕获150。它需要是[0-9]+,最好使用\d+

    所以要解决这个问题,如果你想捕获任何数字,你只需要\d+。如果您想捕获以数字开头的任何内容,则只需将单词边界放在开头\b\d+

    现在要获得第一次出现,您可以使用
    -[regex rangeOfFirstMatchInString:options:range:]

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b\\d+" options:NSRegularExpressionCaseInsensitive error:&regError];
    if (regError) {
        NSLog(@"%@",regError.localizedDescription);
    }
    
    NSString *model = @"150A";
    NSString *foundModel = nil;
    NSRange range = [regex rangeOfFirstMatchInString:model options:kNilOptions range:NSMakeRange(0, [model length])];
    if(range.location != NSNotFound)
    {
        foundModel = [model substringWithRange:range];
    }
    
    NSLog(@"Model: %@", foundModel);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2011-02-04
      • 2010-12-25
      • 1970-01-01
      • 2011-11-21
      • 2018-03-22
      相关资源
      最近更新 更多