Objective-C:查找string中的数字

我有一个包含单词和数字的string。 我怎样才能从string中提取数字?

NSString *str = @"This is my string. #1234"; 

我希望能够将1234作为整数去除。 每次searchstring时都会有不同的数字和单词。

想法?

这是基于NSScanner的解决scheme:

 // 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]; 

(其中一些是很多的)假设:

  • 数字的数字是0-9,没有符号,没有小数点,没有千分隔符,等等。如果需要,你可以添加符号字符到NSCharacterSet。
  • 在string的其他地方没有数字,或者如果他们你想要提取的数字之后
  • 这个数字不会溢出int

或者你可以直接扫描int

 [scanner scanUpToCharactersFromSet:numbers intoString:NULL]; int number; [scanner scanInt:&number]; 

如果#标记string中数字的开始,可以通过以下方式find它:

 [scanner scanUpToString:@"#" intoString:NULL]; [scanner setScanLocation:[scanner scanLocation] + 1]; // Now scan for int as before. 

自包含解决scheme:

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

处理以下情况:

  • @“1234”→@“1234”
  • @“001234”→@“001234”
  • @“领导文字被删除001234”→@“001234”
  • @“001234尾随文字被删除”→@“001234”
  • @“a0b0c1d2e3f4”→@“001234”

希望这可以帮助!

从堆栈溢出尝试这个答案是一个很好的C代码将做的伎俩:

 for (int i=0; i<[str length]; i++) { if (isdigit([str characterAtIndex:i])) { [strippedString appendFormat:@"%c",[str characterAtIndex:i]]; } } 

您可以使用自iOS SDK 4以来的NSRegularExpression类。

波纹一个简单的代码来提取整数( “\ d +”正则expression式模式):

 - (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; } 

迄今为止最好的解决scheme! 我认为正则expression式会更好,但我喜欢它;-)这个过滤所有的数字和连接在一起,使一个新的string。 如果你想拆分多个数字,请稍微改变一下。 请记住,当你在一个大循环中使用它时,性能会降低!

  NSString *str= @"bla bla bla #123 bla bla 789"; NSMutableString *newStr = [[NSMutableString alloc] init];; int j = [str length]; for (int i=0; i<j; i++) { if ([str characterAtIndex:i] >=48 && [str characterAtIndex:i] <=59) { [newStr appendFormat:@"%c",[str characterAtIndex:i]]; } } NSLog(@"%@ as int:%i", newStr, [newStr intValue]); 

NSPredicate是使用ICU正则expression式parsingstring的Cocoa类。

从string获取数字的Swift扩展

 extension NSString { func getNumFromString() -> String? { var numberString: NSString? let thisScanner = NSScanner(string: self as String) let numbers = NSCharacterSet(charactersInString: "0123456789") thisScanner.scanUpToCharactersFromSet(numbers, intoString: nil) thisScanner.scanCharactersFromSet(numbers, intoString: &numberString) return numberString as? String; } }