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