Шаблон NSRegularExpression

Я застрял в определении того шаблона, который даст результаты, которые я ищу. Любая помощь будет оценена.

NSError *regexError = nil;
NSRegularExpression *parsingRegex = [NSRegularExpression regularExpressionWithPattern:@"(vector)\\((.*?)(?:,\\s*(.*?))*\\)"
                                            options:0
                                            error:&regexError];

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:&regexError];

но только если строка

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:&regexError];


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

Но это не так.

Любые идеи?


person learning-ios    schedule 26.12.2013    source источник
comment
В ваших операторах NSLog есть синтаксические ошибки и ошибки копирования/вставки.   -  person Martin R    schedule 26.12.2013
comment
копирование и прошлые ошибки исправлены. Спасибо за улов.   -  person learning-ios    schedule 27.12.2013


Ответы (1)


(vector)\((.*?)(?:,\s*(.*?))*\) имеет 3 группы захвата. Больше никогда не будет.

(vector)\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^)\s]+)\s*\) ближе к тому, что вы хотите.

person Jeffery Thomas    schedule 26.12.2013