Objective-C NSRegularExpressions,查找字符串中第一次出现的数字

rny*_*rom 5 regex cocoa objective-c ios nsregularexpression

使用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;
}];
Run Code Online (Sandbox Code Playgroud)

我要做的就是拿一个字符串

150A
Run Code Online (Sandbox Code Playgroud)

得到

150
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 7

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

  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);
Run Code Online (Sandbox Code Playgroud)