Objective-C:在字符串中查找数字

Nic*_*ard 38 iphone objective-c nsnumber nsstring ios

我有一个包含单词和数字的字符串.如何从字符串中提取该数字?

NSString *str = @"This is my string. #1234";
Run Code Online (Sandbox Code Playgroud)

我希望能够将1234剥离为int.每次搜索时,字符串都会有不同的数字和单词.

想法?

mar*_*ton 101

这是一个基于NSScanner的解决方案:

// Input
NSString *originalString = @"This is my string. #1234";

// Intermediate
NSString *numberString;

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

// Throw away characters before the first number.
[scanner scanUpToCharactersFromSet:numbers intoString:NULL];

// Collect numbers.
[scanner scanCharactersFromSet:numbers intoString:&numberString];

// Result.
int number = [numberString integerValue];
Run Code Online (Sandbox Code Playgroud)

(这里有一些)假设在这里:

  • 数字数字是0-9,没有符号,没有小数点,没有千位分隔符等.如果需要,您可以将符号字符添加到NSCharacterSet.
  • 字符串中的其他位置没有数字,或者如果它们位于您要提取的数字之后.
  • 号码不会溢出int.

或者,您可以直接扫描到int:

[scanner scanUpToCharactersFromSet:numbers intoString:NULL];
int number;
[scanner scanInt:&number];
Run Code Online (Sandbox Code Playgroud)

如果#标记字符串中数字的开头,您可以通过以下方式找到它:

[scanner scanUpToString:@"#" intoString:NULL];
[scanner setScanLocation:[scanner scanLocation] + 1];
// Now scan for int as before.
Run Code Online (Sandbox Code Playgroud)

  • 如果我在字符串中的不同位置有多个数字,那么它只返回第一个数字 (4认同)

Zor*_*ayr 46

自包含解决方案:

+ (NSString *)extractNumberFromText:(NSString *)text
{
  NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
  return [[text componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];
}
Run Code Online (Sandbox Code Playgroud)

处理以下案件:

  • @"1234"→@"1234"
  • @"001234"→@"001234"
  • @"领先文字被删除001234"→@"001234"
  • @"001234尾随文字被删除"→@"001234"
  • @"a0b0c1d2e3f4"→@"001234"

希望这可以帮助!

  • 这是本文中最好,最体面的答案.它比接受的答案更好. (6认同)

Far*_*nen 5

您可以使用 NSRegularExpression 类,自 iOS SDK 4 起可用。

下面是一个提取整数的简单代码(“\d+”正则表达式模式):

- (NSArray*) getIntNumbersFromString: (NSString*) string {

  NSMutableArray* numberArray = [NSMutableArray new];

  NSString* regexPattern = @"\\d+";
  NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:regexPattern options:0 error:nil];

  NSArray* matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
  for( NSTextCheckingResult* match in matches) {
      NSString* strNumber = [string substringWithRange:match.range];
      [numberArray addObject:[NSNumber numberWithInt:strNumber.intValue]];
  }

  return numberArray; 
}
Run Code Online (Sandbox Code Playgroud)