我在目标c
中有如下字符串 NSString *str = @"access_token=E2JmCPLtVySGn-cGGJGGnQ&email=abc@gmail.com";
我怎样才能获得 E2JmCPLtVySGn-cGGJGGnQ ?
答案 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个字符。