得到nsstring的某些部分

时间:2014-07-02 12:48:54

标签: ios nsstring

我在目标c

中有如下字符串
   NSString *str = @"access_token=E2JmCPLtVySGn-cGGJGGnQ&email=abc@gmail.com";

我怎样才能获得 E2JmCPLtVySGn-cGGJGGnQ

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式(RegEx)查找字符模式。

模式匹配语法可以在ICU用户指南Regular Expressions

中找到

在示例中,模式是:找到第一个“=”和所有字符,但不包括字符“&”。在模式'(?< = access_token =)中是一个后视断言,意味着“access_token =”必须在匹配的文本之前,“[^&] +”括号“[]”表示一个字符class,“^”al但是后面的字符,“+”表示一个或多个。

NSString *str = @"access_token=E2JmCPLtVySGn-cGGJGGnQ&email=abc@gmail.com";
NSString *regexPattern = @"(?<=access_token=)[^&]+";
NSString *found = nil;

NSRange range = [str rangeOfString:regexPattern options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
    found = [str substringWithRange:range];
}

NSLog(@"Range: %@", NSStringFromRange(range));
NSLog(@"found: %@", found);

如果找到NSLog输出:

  

范围:{13,22}
  发现:E2JmCPLtVySGn-cGGJGGnQ

答案 1 :(得分:1)

有一个名为rangeOfString:的NSString类的方法,它返回一个NSRange结构。如果您知道返回的值始终包含文本access_token=并且还包含&email且格式始终相同,则可以使用此rangeOfString:方法嗅探令牌。

NSRange accessTokenRange = [str rangeOfString:@"access_token="];
//this would return (0,13) for index:0, length: 13
NSRange emailRange = [str rangeOfString:@"&email="];
//this would return (34,7) 
NSInteger tokenLength = ( emailRange.location + 1 ) - accessTokenRange.length;
//the point where &email begins is at index 34, but it starts at 0
//so it's actually the 35th character
//the access_token= string is 13 characters long, so 35-13 = 22
//so you know that the actual token value is 22 characters long
NSRange trueTokenRange = NSMakeRange(accessTokenRange.length,tokenLength);
NSString *tokenSubstring = [str substringWithRange:trueTokenRange];

我不认为我的数学已关闭,如果你不小心,零索引可以引入1个错误,我通常每个范围都有NSLog,所以我可以仔细检查我需要添加的位置或减1.但基本上你将从第14个字符开始,这是字符串的索引13,并读取接下来的22个字符。