目标C:如何提取字符串的一部分(例如以'#'开头)

Zhe*_*hen 32 hash substring objective-c nsstring ios

我有一个字符串,如下所示,

NSString * aString = @"This is the #substring1 and #subString2 I want";
Run Code Online (Sandbox Code Playgroud)

如何只选择以"#"开头的文本(以空格结尾),在本例中为"subString1"和"subString2"?

注意:编辑问题是为了清晰起见

ugh*_*fhw 56

您可以使用NSScanner将字符串拆分.此代码将循环遍历字符串并使用子字符串填充数组.

NSString * aString = @"This is the #substring1 and #subString2 I want";
NSMutableArray *substrings = [NSMutableArray new];
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before #
while(![scanner isAtEnd]) {
    NSString *substring = nil;
    [scanner scanString:@"#" intoString:nil]; // Scan the # character
    if([scanner scanUpToString:@" " intoString:&substring]) {
        // If the space immediately followed the #, this will be skipped
        [substrings addObject:substring];
    }
    [scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before next #
}
// do something with substrings
[substrings release];
Run Code Online (Sandbox Code Playgroud)

以下是代码的工作原理:

  1. 扫描到#.如果找不到,扫描仪将位于字符串的末尾.
  2. 如果扫描仪位于字符串的末尾,我们就完成了.
  3. 扫描#字符,使其不在输出中.
  4. 扫描到一个空格,扫描存储的字符substring.如果#是最后一个字符,或者后面紧跟一个空格,则该方法将返回NO.否则它将返回YES.
  5. 如果扫描了字符(方法返回YES),则添加substringsubstrings数组中.
  6. GOTO 1


Var*_*rji 33

[aString substringWithRange:NSMakeRange(13, 10)] 
Run Code Online (Sandbox Code Playgroud)

会给你substring1

您可以使用以下方法计算范围:

NSRange startRange = [aString rangeOfString:@"#"];
NSRange endRange = [original rangeOfString:@"1"];

NSRange searchRange = NSMakeRange(startRange.location , endRange.location);
[aString substringWithRange:searchRange] 
Run Code Online (Sandbox Code Playgroud)

会给你substring1

阅读更多: 字符在NSString或NSMutableString中的位置

http://iosdevelopertips.com/cocoa/nsrange-and-nsstring-objects.html


Rob*_*way 11

非常简单,易于理解的版本,避免了NSRange东西:

NSArray * words = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSMutableArray * mutableWords = [NSMutableArray new];
for (NSString * word in words){
    if ([word length] > 1 && [word characterAtIndex:0] == '#'){
        NSString * editedWord = [word substringFromIndex:1];
        [mutableWords addObject:editedWord];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是最好的答案,因为它是最简单有效的! (2认同)

Bra*_*000 5

假设您要查找以磅开头的第一个字符串,并以空格结尾,这可能会起作用.我没有在我面前使用XCode,所以请原谅我,如果语法错误或长度偏离1:

-(NSString *)StartsWithPound:(NSString *)str {
    NSRange range = [str rangeOfString:@"#"];
    if(range.length) {
        NSRange rangeend = [str rangeOfString:@" " options:NSLiteralSearch range:NSMakeRange(range.location,[str length] - range.location - 1)];
        if(rangeend.length) {
            return [str substringWithRange:NSMakeRange(range.location,rangeend.location - range.location)];
        }
        else
        {
            return [str substringFromIndex:range.location];
        }
    }
    else {
        return @"";
    }
}
Run Code Online (Sandbox Code Playgroud)