Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:如何提取字符串的一部分(例如,从';';)开始)_Objective C_Ios_Hash_Nsstring_Substring - Fatal编程技术网

Objective c 目标C:如何提取字符串的一部分(例如,从';';)开始)

Objective c 目标C:如何提取字符串的一部分(例如,从';';)开始),objective-c,ios,hash,nsstring,substring,Objective C,Ios,Hash,Nsstring,Substring,我有一个字符串,如下所示 NSString * aString = @"This is the #substring1 and #subString2 I want"; 如何仅选择以“#”开头(并以空格结尾)的文本,在本例中为“subString1”和“subString2” 注:为清晰起见,对问题进行了编辑 [aString substringWithRange:NSMakeRange(13, 10)] 我会给你一个子串 可以使用以下公式计算范围: NSRange startRange

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

NSString * aString = @"This is the #substring1 and #subString2 I want";
如何仅选择以“#”开头(并以空格结尾)的文本,在本例中为“subString1”和“subString2”

注:为清晰起见,对问题进行了编辑

[aString substringWithRange:NSMakeRange(13, 10)] 
我会给你一个子串

可以使用以下公式计算范围:

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

NSRange searchRange = NSMakeRange(startRange.location , endRange.location);
[aString substringWithRange:searchRange] 
我会给你一个子串

阅读更多:


假设您正在查找以磅开头、以空格结尾的第一个字符串,这可能会起作用。我面前没有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 @"";
    }
}
可以使用将字符串拆分的方法来执行此操作。这段代码将循环一个字符串并用子字符串填充数组

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];
下面是代码的工作原理:

  • 扫描到一个#。如果找不到,扫描仪将位于字符串的末尾
  • 如果扫描器在字符串的末尾,我们就完成了
  • 扫描#字符,使其不在输出中
  • 最多扫描一个空格,扫描的字符存储在
    子字符串中。如果#是最后一个字符,或者紧跟空格,则该方法将返回NO。否则,它将返回YES
  • 如果扫描了字符(方法返回YES),则将
    子字符串
    添加到
    子字符串
    数组中
  • 转到1

  • 非常简单、易于理解的版本避免
    NSRange
    stuff:

    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];
        }
    }
    

    另一个简单的解决方案:

    NSRange hashtag = [aString rangeOfString:@"#"];
    NSRange word = [[aString substringFromIndex:hashtag.location] rangeOfString:@" "];
    NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, word.location)];
    

    选择NSString中以“#”开头的所有单词的通用且简单的代码是:

    NSString * aString = @"This is the #substring1 and #subString2 ...";
    NSMutableArray *selection=@[].mutableCopy;
    while ([aString rangeOfString:@"#"].location != NSNotFound)
    {
        aString = [aString substringFromIndex:[aString rangeOfString:@"#"].location +1];
        NSString *item=([aString rangeOfString:@" "].location != NSNotFound)?[aString substringToIndex:[aString rangeOfString:@" "].location]:aString;
        [selection addObject:item];
    }
    
    如果您仍然需要原始字符串,可以进行复制。 如果您选择的项目是最后一个单词,则使用内联条件。这就是我要做的:

    NSString *givenStringWithWhatYouNeed = @"What you want to look through";
    NSArray *listOfWords = [givenStringWithWhatYouNeed componentsSeparatedByString:@" "];
    for (NSString *word in listOfWords) {
        if ([[word substringWithRange:NSMakeRange(0, 1)]isEqualToString:@"#"]) {
            NSString *whatYouWant = [[word componentsSeparatedByString:@"#"]lastObject];
        }
    }
    
    然后,您可以使用
    whatYouWant
    实例执行所需操作。如果您想知道它是哪个字符串(如果是子字符串1或2),请检查
    listOfWords
    数组中
    word
    字符串的索引


    我希望这能有所帮助。

    你怎么知道子字符串的结尾呢?根据问题,我认为他指的是空格之前的所有内容。非常感谢!今晚救了我!非常感谢。这是最好的答案,因为它是最简单和有效的!给我一个比较的警告。必须进行字符串比较=@“#”,然后必须使用[word characterAtIndex:0]==[compare characterAtIndex:0]。是的,非常简单+1子字符串1只是一个例子。寻找“1”的硬编码很糟糕。如果您不知道#后面的字符串是什么,那么这不是正确的解决方案。此外,这并不能回答查找#之后出现的所有字符串的OP问题。子字符串2呢?