Ios 扫描目标-C中的数字

Ios 扫描目标-C中的数字,ios,objective-c,nsstring,Ios,Objective C,Nsstring,我不知道怎样才能找到下面所有的数字 输入 NSString* input = @ "1m3s" 期望输出 @[@"1" @"3"] 我尝试了以下方法 NSArray *arr = [input componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"ms"]]; 它回报了我 @[@"1",@"3",@"@"] 有没有

我不知道怎样才能找到下面所有的数字

输入

NSString* input = @ "1m3s"
期望输出

@[@"1" @"3"]
我尝试了以下方法

NSArray *arr = [input componentsSeparatedByCharactersInSet:
                        [NSCharacterSet characterSetWithCharactersInString:@"ms"]];
它回报了我

@[@"1",@"3",@"@"]
有没有更好的方法来解决这个问题,有什么建议吗

尽管这个问题被标记为重复,但我已经测试了以下内容,但不起作用

更新

可以是任何字符串值

如果输入为
@“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);
NSString*originalString=@“1m3s”;
NSMutableArray*arr=[[NSMutableArray alloc]init];
对于(int i=0;i使用以下代码:

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

        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*input=@“1m3s”;
NSString*newString=[[input Components由字符分隔的集合:
[[NSCharacterSet decimalDigitCharacterSet]InversedSet]]
组件通过字符串连接:@“];
NSMutableArray*数组=[NSMutableArray];
对于(int i=0;i<[newString length];i++){
NSString*ch=[newString substringWithRange:NSMakeRange(i,1)];
[数组addObject:ch];
}
NSLog(@“%@”,array.description);

您也可以使用下面的代码

NSString * String = @"24fsd35rf";
NSArray* Array = [String componentsSeparatedByCharactersInSet:
                              [[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
NSLog(@"%@",[Array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]]);
NSString*String=@“24fsd35rf”;
NSArray*数组=[字符串组件由字符分隔集:
[[NSCharacterSet decimalDigitCharacterSet]InversedSet]];
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);

查看NSString方法
Components以字符分隔的集合
,并将其输出传递给您已经完成的操作。我已经尝试过了,请查看我的更新问题。您想将数字作为
NSArray
?不,是的,我想将数字作为
NSArray
。11m32s的输出是什么此字符串?使用
%c
仅适用于ASCII(8位)字符。但是
characterAtIndex
返回16位字符。至少使用
%c
。输出不是
NSArray
,它也返回我
@[@“1”,“3”,“@”]
没有。如果最后一个字符是非数字字符,那么您将得到一个
空字符串。从数组中删除空字符串将只得到数字。如果输入
[11m32s]
则失败。所需的输出
[11,32]
。我对您的努力进行了优化。谢谢!但是当我输入
[11m32s]
,我得到了结果数组:(11,32)使用相同的代码我还测试了
11m32s
11m32
,当我记录结果数组时得到了(11,32),如果输入是
@“11x32”
@11x32y
正如我在问题中提到的,它可以是任何字符?第一个版本涵盖了这两个字符。它考虑字符串中出现的任何一个或多个数字。使用正则表达式完全是矫枉过正和缓慢的。只需使用NSScanner。这是一个更好的解决方案。
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);