NSRegularExpression
我有一个string:
?key=123%252Bf-34Fa&name=John ?name=Johon&key=123%252Bf-34Fa
我想要得到的key
的价值,我用这个NSRegularExpression (?i)(?<=key=)[.?!&]+[?=&]??
我认为模式就像匹配除“&”之外的任何字符,但结果总是为NULL
。
每个键的值可以有除“&”之外的任何值。 那么如何创build正确的NSRegularExpression? 谢谢。
你不应该使用这个正则expression式,特别是如果你不知道如何。 比较:
NSString *string = @"?name=Johon&key=123%252Bf-34Fa"; // NSString *string = @"?key=123%252Bf-34Fa&name=John"; // one way NSRange range = [string rangeOfString:@"key="]; if (range.location!=NSNotFound){ string = [string substringFromIndex:NSMaxRange(range)]; range = [string rangeOfString:@"&"]; if (range.location!=NSNotFound){ string = [string substringToIndex:range.location]; } } // another way __block NSString *keyValue = nil; [[string componentsSeparatedByString:@"&"] enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop){ NSRange range = [object rangeOfString:@"key="]; if (range.location!=NSNotFound){ keyValue = [object substringFromIndex:range.location+range.length]; *stop = YES; } }]; // regex way NSString *regexStr = @"[\\?&]key=([^&#]*)"; NSError *error = nil; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexStr options:0 error:&error]; // enumerate all matches if ((regex==nil) && (error!=nil)){ NSLog( @"Regex failed for url: %@, error was: %@", string, error); } else { [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop){ if (result!=nil){ // iterate ranges for (int i=0; i<[result numberOfRanges]; i++) { NSRange range = [result rangeAtIndex:i]; NSLog(@"%ld,%ld group #%d %@", range.location, range.length, i, (range.length==0 ? @"--" : [string substringWithRange:range])); } } }]; }
我知道答案发布已经有好几年了,但是rangeOfString
的回答中的代码在技术上是正确的, rangeOfString
多次调用rangeOfString
效率非常低。
正则expression式其实很简单。 您可以执行以下两项之一:
key=([^&\s]+) // searches for the key // matches all characters other than whitespace characters // and ampersands ([^&?\s]+)=([^&\s]+) // searches for key/value pairs // key matches all characters other than whitespace characters // and ampersands and question marks // value matches all characters other than whitespace characters // and ampersands
Objective-C中使用NSRegularExpression
的代码如下所示:
NSString *stringToSearch = @"?name=John&key=123%252Bf-34Fa" NSError *error; NSRegularExpression *findKey = [NSRegularExpression regularExpressionWithPattern:@"key=([^&\\s]+)" options:0 error:&error]; if (error) { // log error } NSString *keyValue; NSTextCheckingResult *match = [findKey firstMatchInString:stringToSearch options:0 range:NSMakeRange(0, stringToSearch.length)]; if (match) { NSRange keyRange = [match rangeAtIndex:1]; keyValue = [stringToSearch substring:keyRange]; }
或者像这样:
NSString *stringToSearch = @"?name=John&key=123%252Bf-34Fa" NSError *error; NSRegularExpression *findParameters = [NSRegularExpression regularExpressionWithPattern:@"([^&?\\s]+)=([^&\\s]+)" options:0 error:&error]; if (error) { // log error } NSMutableDictionary *keyValuePairs = [[NSMutableDictionary alloc] init]; NSArray *matches = [findParameters matchesInString:stringToSearch options:0 range:NSMakeRange(0, stringToSearch.length)]; for (NSTextCheckingResult *match in matches) { NSRange keyNameRange = [match rangeAtIndex:1]; NSRange keyValueRange = [match rangeAtIndex:2]; keyValuePairs[[stringToSearch substring:keyNameRange]] = [stringToSearch substring:keyValueRange]; }
在实际代码中使用正则expression式时,请注意双反斜杠(\\)来转义反斜杠。
- 电子邮件使用特殊字符的正则expression式问题
- 如何在iOS中validation美国或加拿大的Zipcode?
- Objective-C中的正则expression式:如何用dynamic模板replace匹配?
- 使用字符分隔符在Swift中查找和突出显示文本
- 密码validation的正则expression式Objective-C
- 在为iPhone UITextViewinput(如Twitter)时build议#标签
- 我怎么能在Objective-C中正确地转义这个正则expression式?
- Swift正则expression式和反斜杠
- Cocoa错误2048在cocoa中使用NSRegularExpression