【问题标题】:How to filter a string after a particular character in iOS? [duplicate]如何在iOS中的特定字符之后过滤字符串? [复制]
【发布时间】:2013-08-18 22:43:42
【问题描述】:

我想在字符“=”之后过滤字符串。例如,如果 8+9=17 我的输出应该是 17。我可以使用 NSScanner 在“=”之前过滤字符,如何反转?我需要一种有效的方法来做到这一点,而不使用 componentsSeparatedByString 或创建一个数组

【问题讨论】:

  • componentsSeparatedByString 是(在我的看来)最常被滥用的方法之一。为什么要创建数组? rangeOfString+substringFromIndex 不是更直接吗?但是 SO 回答者和读者似乎喜欢它! - 对不起,我不得不说一次。
  • Martin R 是对的,但我不确定 rangeOfString 选项如何更好。我建议通过按答案下方的复选标记来接受@rmaddy 的答案而不是我的答案。
  • 您能解释一下为什么您对提议的解决方案不满意(例如,使用componentsSeparatedByString)吗?
  • 当你只想要一个字符串的一部分时,这是非常低效的。我标记为最佳答案的那个是最好的描述。在我的要求中,我有一个像 8+9=+9-7=19 这样的日志,我只需要从此类日志数组中过滤 19 个。
  • 试试这个 NSArray* foo = [@"10/04/2011" componentsSeparatedByString: @"/"]; NSString* day = [foo objectAtIndex: 0];

标签: ios nsstring nsscanner


【解决方案1】:
NSArray * array = [string componentsSeparatedByString:@"="];
if (array)
{
    NSString * desiredString = (NSString *)[array lastObject]; //or whichever the index
}
else
{
    NSLog(@""); //report error - = not found. Of array could somehow be not created.
}

注意: 尽管这是非常流行的拆分解决方案,但只有在需要每个子字符串由分隔符字符串分隔时才值得尝试。 rmaddy 的回答建议在只需要获取一小部分字符串时使用更好的机制。只要只需要字符串的一小部分,就使用它而不是这种方法。

【讨论】:

  • 这是获取较大字符串的一小部分的一种非常低效的方法。
  • 这是简单有效的 LOC。肯定会 +1!
  • 检查数组计数然后赋值 if ([array count]>1) { NSString * desiredString = (NSString *)[array objectAtIndex:1]; //或任何索引 } else { NSLog(@""); //报告错误 - = 未找到。数组可能以某种方式无法创建。 }
【解决方案2】:

使用这个:

 NSString *a =@"4+6=10";
    NSLog(@"%@",[a componentsSeparatedByString:@"="])

;

 Log: Practice[7582:11303] (
        "4+6",
        10
    )

【讨论】:

    【解决方案3】:

    尝试使用这个

            NSArray *arr = [string componentsSeparatedByString:@"="];
            if (arr.count > 0)
            {
                NSString * firstString = [arr objectAtIndex:0];
                NSString * secondString = [arr objectAtIndex:1];
                NSLog(@"First String %@",firstString);
                NSLog(@"Second String %@",secondString);
            }
    

    输出

    第一个字符串 8+9

    第二个字符串 17

    【讨论】:

    • 如果字符串中没有=,此代码将崩溃。
    • 第一个NSLog应该是NSLog(@"First String %@",firstString);
    • @PradeepReddyKyp 感谢您的指正。
    【解决方案4】:

    似乎每个人都喜欢使用componentsSeparatedByString,但是当你只想要字符串的一部分时,它是非常低效的。

    试试这个:

    NSString *str = @"8+9=17";
    NSRange equalRange = [str rangeOfString:@"=" options:NSBackwardsSearch];
    if (equalRange.location != NSNotFound) {
        NSString *result = [str substringFromIndex:equalRange.location + equalRange.length];
        NSLog(@"The result = %@", result);
    } else {
        NSLog(@"There is no = in the string");
    }
    

    更新:

    注意 - 对于这个特定示例,如果只执行一次,则效率差异可以忽略不计。

    但一般来说,使用componentsSeparatedByString: 将扫描整个字符串以查找每个出现的分隔符。然后它创建一个包含所有子字符串的数组。当您需要大多数这些子字符串时,这非常有用。

    当您只需要较大字符串的一部分时,这是非常浪费的。无需扫描整个字符串。无需创建数组。无需获取所有其他子字符串。

    【讨论】:

    • +1 因为我已经模糊地认为你是对的。你能解释一下相对优势吗?我建议 OP 接受你的回答而不是我的回答。
    • 查看我的更新以获得解释。
    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多