Ios 使用NSString中的多个模式提取多个子字符串

Ios 使用NSString中的多个模式提取多个子字符串,ios,iphone,objective-c,nsstring,Ios,Iphone,Objective C,Nsstring,对于一个NSString,我有两个模式字符串。我想提取与模式匹配的子字符串。字符串格式类似于“@Realname![username]”,我想将Realname和username分开,然后将这两个字符串放在一个数组中 编辑:我还想从一个更大的字符串中搜索这个特定的子字符串,该字符串类似于“几乎任何@Realname![username]文本,可以键入这些废话…” 此外,同一格式的字符串中可以有任意多个子字符串,并且该字符串可以包含任何字符,包括“@”、“!”、“[”或“]” 示例字符串:“几乎任

对于一个
NSString
,我有两个模式字符串。我想提取与模式匹配的子字符串。字符串格式类似于
“@Realname![username]”
,我想将
Realname
username
分开,然后将这两个字符串放在一个数组中

编辑:我还想从一个更大的字符串中搜索这个特定的子字符串,该字符串类似于
“几乎任何@Realname![username]文本,可以键入这些废话…”

此外,同一格式的字符串中可以有任意多个子字符串,并且该字符串可以包含任何字符,包括“@”、“!”、“[”或“]”


示例字符串:
“几乎任何@Realname1![username1]文本都可以是@Realname2![username2]键入的废话……”

您可以使用由字符串分隔的组件:NSString类的方法找到您的起点:

[string rangeOfString:@"@"].location
使用以下代码段:

NSString *name = @"@Realname![username]";

NSArray *comp = [name componentsSeparatedByString:@"!["];

NSString *realname = [comp.firstObject substringFromIndex:1];
NSString *username = [comp.lastObject substringToIndex:name.length -1];

我想说
组件由字符串分隔:
是最简单的方法,但是,更通用(而且更正确,IMO)的方法是使用
NSRegularExpresison

....

NSString *string = @"@Realname![username]";
NSRegularExpression *nameExpression = [NSRegularExpression regularExpressionWithPattern:@"@([^\\!]+)\\!\\[([^\\]]+)\\]" options:NSRegularExpressionSearch error:nil];

NSArray *matches = [nameExpression matchesInString: string
                                  options:0
                                    range:NSMakeRange(0, [string length])];
NSTextCheckingResult *nameMatch = [matches firstObject];
NSRange realNameMatchRange = [nameMatch rangeAtIndex: 1];
NSRange usernameMatchRange = [nameMatch rangeAtIndex: 2];

NSString *realName = [string substringWithRange: realNameMatchRange];
NSString *username = [string substringWithRange: usernameMatchRange];

....

有很多NSString方法可以让您构建这个函数

您可以使用rangeOfString构建它:

您将找到第一个字符串开头“@”和“!”的范围,并将子字符串置于这两个字符串之间。然后你会找到“[”和“]”的范围,并在那些2之间取子字符串。

试试这个

-(NSString*)stringBetweenString:(NSString*)start andString:(NSString*)end inString:(NSString *)text{

    NSScanner* scanner = [NSScanner scannerWithString:text];
    [scanner setCharactersToBeSkipped:nil];
    if ([scanner scanString:start intoString:NULL]) {
        NSString* result = nil;
        if ([scanner scanUpToString:end intoString:&result]) {
            return result;
        }
    }
    return nil;
}
ans使用

NSString * str = [self stringBetweenString:@"@" andString:@"!" inString:yourString];
NSLog(@"%@", str);

NSString * userName = [self stringBetweenString:@"[" andString:@"]" inString:yourString];
NSLog(@"%@", userName);

这非常适用于令牌的多次出现。只需要将第一个子字符串附加到最后一个字符串
 NSString* str = @"just about any @Realname![username] text which can be typed blah blah...@Realname![username]text which can be typed blah blah...";
    NSRange segmentRange = [str rangeOfString:@"@"];
    while (segmentRange.location != NSNotFound)
    {
        NSRange endRange = [str rangeOfString:@"!"];
        NSString* value = [str substringWithRange:NSMakeRange(segmentRange.location + [@"@" length], endRange.location -(segmentRange.location + [@"@" length]))];
        NSString* realName = value;
        NSLog(@"real String : %@", realName);
        NSRange startRange1 = [str rangeOfString:@"["];
        NSRange endRange1 = [str rangeOfString:@"]"];
        NSString* secondValue = [str substringWithRange:NSMakeRange(startRange1.location + [@"[" length], endRange1.location -(startRange1.location + [@"[" length]))];
        NSString* userName = secondValue ;
        NSLog(@"user Name : %@", userName);
        str = [str substringFromIndex:endRange1.location+1 ];
        NSLog(@"the new string : %@", str);

        segmentRange = [str rangeOfString:@"@"];
    }