扫描 Objective 中的数字 - C

Scan for numbers in Objective - C

我想知道我怎么能找到下面所有的数字。

输入

NSString* input = @ "1m3s"

期望的输出

@[@"1" @"3"]

我试过以下方法

NSArray *arr = [input componentsSeparatedByCharactersInSet:
                        [NSCharacterSet characterSetWithCharactersInString:@"ms"]];

它返回我

@[@"1",@"3",@"@"]

有没有更好的方法来解决这个问题,有什么建议吗?

尽管这个问题已被标记为重复,但我已经测试了以下 answer 但没有奏效。

更新

可以是任何字符串值。

如果输入为 @"11m32s"@11m32,则所需输出为 @[@"11", @"32"];

如果输入为 @"11x32"@11x32y,则所需输出为 @[@"11", @"32"];

我认为下面的代码对我有用。

NSString *originalString = @"1m3s";
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    for (int i=0; i<[originalString length]; i++) {
        if (isdigit([originalString characterAtIndex:i])) {
            NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];
            [strippedString appendFormat:@"%c",[originalString characterAtIndex:i]];
            [arr addObject:strippedString];
        }
    }
    NSLog(@"%@",arr.description);

使用下面的代码:

 NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
 NSArray *outArray = [[input componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];

使用这个方便的方法:

+ (NSArray *)extractNumberFromText:(NSString *)text
{
    NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    NSMutableArray *numberArray = [[text componentsSeparatedByCharactersInSet:nonDigitCharacterSet]mutableCopy];
    [numberArray removeObject:@""];
    return numberArray;
}

尝试:

NSString* input = @ "1m3s";
NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
NSArray *outArray = [input componentsSeparatedByCharactersInSet:nonDigitCharacterSet];
outArray = [outArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]];

这是获取您想要的输出的代码:

  NSString* input = @"1m3s";

        NSString *newString = [[input componentsSeparatedByCharactersInSet:
                                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                               componentsJoinedByString:@""];


        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i < [newString length]; i++) {
            NSString *ch = [newString substringWithRange:NSMakeRange(i, 1)];
            [array addObject:ch];
        }


        NSLog(@"%@",array.description);

您也可以使用下面的代码。

NSString * String = @"24fsd35rf";
NSArray* Array = [String componentsSeparatedByCharactersInSet:
                              [[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
NSLog(@"%@",[Array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]]);

要提取数字,您可以使用正则表达式。

NSString* input = @ "1m3s";
NSString *pattern = @"\d+"; // searches for one or more digits
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
NSArray *matches = [regex matchesInString:input options:0 range:NSMakeRange(0, input.length)];
NSMutableArray *result = [[NSMutableArray alloc] init];
for (NSTextCheckingResult *match in matches) {
    [result addObject: [input substringWithRange:match.range]];
}
NSLog(@"%@", result);

或者,如果您想更具体地提取表达式 ##m##s 中的数字,请使用

NSString* input = @ "1m3s";
NSString *pattern = @"(\d+)m(\d+)s";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:input options:0 range:NSMakeRange(0, input.length)];
if (match) {
    NSArray *result = @[[input substringWithRange:[match rangeAtIndex:1]], [input substringWithRange:[match rangeAtIndex:2]]];
    NSLog(@"%@", result);
}

使用 NSScanner 也可以扫描浮点数。此外,您的数组直接使用 NSNumber 而不是 NSString 填充。

NSString * input = @ "12m32s";
NSScanner * aScanner = [NSScanner scannerWithString:input];
NSInteger aInt;
NSMutableArray * result = [NSMutableArray array];
while (!aScanner.isAtEnd)
{
    if ([aScanner scanInteger:&aInt])
    {
        [result addObject:@(aInt)];
    }
    if (!aScanner.isAtEnd)
    {
        aScanner.scanLocation += 1;
    }
}
NSLog(@"%@",result);