5

我对 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
4

2 回答 2

8

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

  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);
于 2012-10-26T18:48:27.290 回答
0

怎么样.*?(\d+).*?

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

于 2012-10-26T18:48:07.600 回答