Objective-C: найти числа в строке - PullRequest
38 голосов
/ 12 января 2011

У меня есть строка, которая содержит слова и число. Как я могу извлечь это число из строки?

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

Я хотел бы иметь возможность вырезать 1234 как int. Строка будет содержать разные цифры и слова каждый раз, когда я ее ищу.

Идеи

Ответы [ 7 ]

100 голосов
/ 12 января 2011

Вот решение на основе 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];

(Некоторые из множества) сделанных здесь предположений:

  • Цифры от 0 до 9,без знака, без десятичной точки, без разделителей тысяч и т. д. При необходимости вы можете добавить знаковые символы в NSCharacterSet.
  • В другом месте строки нет цифр, или, если они есть, они после номер, который вы хотите извлечь.
  • номер не будет переполнен int.

В качестве альтернативы вы можете сканировать прямо на int:

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

Если # отмечает начало числа в строке, вы можете найти его с помощью:

[scanner scanUpToString:@"#" intoString:NULL];
[scanner setScanLocation:[scanner scanLocation] + 1];
// Now scan for int as before.
44 голосов
/ 05 декабря 2014

Автономное решение:

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

Обрабатывает следующие случаи:

  • @ "1234" → @ "1234"
  • @ "001234" →@ "001234"
  • @ "удален начальный текст 001234" → @ "001234"
  • @ "Удален конечный текст 001234" → @ "001234"
  • @ "a0b0c1d2e3f4 "→ @" 001234 "

Надеюсь, это поможет!

4 голосов
/ 12 января 2011

Вы можете использовать класс 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; 
}
3 голосов
/ 12 января 2011

Попробуйте этот ответ из Stack Overflow, чтобы получить хороший фрагмент кода на C, который сделает свое дело:

for (int i=0; i<[str length]; i++) {
        if (isdigit([str characterAtIndex:i])) {
                [strippedString appendFormat:@"%c",[str characterAtIndex:i]];
        }
}
1 голос
/ 12 января 2011

На сегодняшний день лучшее решение! Я думаю, что регулярное выражение было бы лучше, но я вроде как sux в этом ;-) это фильтрует ВСЕ числа и объединяет их вместе, создавая новую строку. Если вы хотите разделить несколько чисел, измените это немного. И помните, что когда вы используете это внутри большого цикла, это снижает производительность!

    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]);
0 голосов
/ 17 октября 2016

Расширение 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;
}
}
0 голосов
/ 12 января 2011

NSPredicate - класс Какао для разбора строки с использованием регулярного выражения ICU .

...