Я застрял в определении того шаблона, который даст результаты, которые я ищу. Любая помощь будет оценена.
NSError *regexError = nil;
NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(vector)\\((.*?)(?:,\\s*(.*?))*\\)"
options:0
error:®exError];
NSString *mystring = @"vector(0.1, 0.0, 0.0, 1.0)";
NSTextCheckingResult *parse = [parsingRegex firstMatchInString:mystring
options:0
range:NSMakeRange(0, [string length])];
NSLog(@"string0 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:0]]);
NSLog(@"string1 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:1]]);
NSLog(@"string2 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:2]]);
NSLog(@"string3 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:3]]);
NSLog(@"string4 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:4]]);
NSLog(@"string4 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:5]]);
Я ожидаю следующий вывод:
string0 = vector(0.1, 0.0, 0.0, 1.0)
string1 = vector
string2 = 0.1
string3 = 0.0
string4 = 0.0
string5 = 1.0
Я получаю следующий вывод:
string0 = vector(0.1, 0.0, 0.0, 1.0)
string1 = vector
string2 = 0.1
string3 = 1.0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSExtendedRegularExpressionCheckingResult rangeAtIndex:]: index 4 out of range'
Спасибо
Итак, это работает:
Шаблон:
NSRegularExpression *parsingRegex = [NSRegularExpression
regularExpressionWithPattern:@"(vector)\\((.*?)(?:,\\s*(.*?))(?:,\\s*(.*?))(?:,\\s*(.*?))*\\)"
options:0
error:®exError];
но только если строка
NSString *mystring = @"vector(0.1, 0.0, 0.0, 1.0)";
Если строка:
NSString *mystring = @"value(0.1)";
Я ожидал, что:
NSRegularExpression *parsingRegex = [NSRegularExpression
regularExpressionWithPattern:@"(vector|value)\\((.*?)(?:,\\s*(.*?))(?:,\\s*(.*?))(?:,\\s*(.*?))*\\)"
options:0
error:®exError];
NSLog(@"string0 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:0]]);
NSLog(@"string1 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:1]]);
NSLog(@"string2 =%@\n"[mystring substringWithRange:[parse rangeAtIndex:2]]);
поработал бы и вернулся
string0 = value(0.1)
string1 = value
string2 = 0.1
Но это не так.
Любые идеи?