2013-07-04 1 views
1

У меня есть регулярное выражение, которое работает с RegExr, но не работает с NSRegularExpression в Objective-C. Проблема связана с символами «и», которая является часть строки, которую я хочу найти. Мое регулярное выражение:NSRegularExpression, похоже, не распознает символы «и» в выражении

(?<=\"Here\":\")(.*?)(?=\"}) 

С этим выражением, Xcode говорит «ожидается:», и с \ перед}, и Xcode также говорит, что он не признает}. Я использую все эти варианты для работы с RegExr.

Для строк, как это:

{"Something":"Something else", "Here" : "What I want is between these quotation marks"} 

Я посмотрел в documentation, но я не нашел ничего об этих символах там.

Мой код:

NSRegularExpression *regEx = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"Here\":\")(.*?)(?=\"})"options:NSRegularExpressionCaseInsensitive error:&error]; 
NSArray *matches = [regEx matchesInString:stringToSearch options:0 range:NSMakeRange(0, [stringToSearch length])]; 
[matches count] // Returns 0 

Так, где моя ошибка? Может быть, все выражения ошибочны, и проблема RegExr?

Заранее спасибо.

+3

Похоже, вы пытаетесь разобрать строковое представление хеш-таблицы или словаря. Вы уверены, что для этого нет лучшей библиотеки? – Monolo

+1

Да, это похоже на JSON, поэтому можно использовать NSJSONSerialization. –

+0

Да, это JSON. Спасибо вам обоим, я тоже проверю этот вариант, так как он, вероятно, более эффективен. ;) – Esso

ответ

1

Ваш рисунок должен выглядеть примерно так:

@"(?<=\"Here\":\")(.*?)(?=\"\\})" 

Как " используются в качестве разделителей для NSString, вы должны экранировать их (т. Е добавить \ перед всеми " в строке).

EDIT: Как отмечено MartinR в комментариях, вам также необходимо, чтобы избежать } с две косыми чертами \\, как это специальный символ в регулярных выражениях.

Это должно появиться совершенно ясно с синтаксисом окрашиванию:

code syntax colored

Полный код:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"Here\":\")(.*?)(?=\"})" 
                    options:NSRegularExpressionCaseInsensitive // or whatever options you want to use 
                    error:&error]; 
+0

Я убежал от них в Objective-C и RegExr, но, к сожалению, он работал только в последнем. Спасибо за предложение, я обновил вопрос с помощью выражения «escaping». – Esso

+0

Не могли бы вы вставить точный код, который вы пытаетесь скомпилировать? –

+2

Символ '}' должен быть экранирован в регулярном выражении (и с двойным экранированием в NSString: '@" ... \\} ... "'). –

3

Вы должны просто использовать NSJSONSerialization, чтобы разобрать ваш JSON:

Например

NSData *data = ... // load your {"Something":"Something else", "Here" : "What I want is between these quotation marks"} 

NSError *error; 
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
if (error) 
    NSLog(@"%s: JSONObjectWithData error: %@", __FUNCTION__, error); 

NSLog(@"value for Something: %@", dictionary[@"Something"]); 
NSLog(@"value for Here: %@", dictionary[@"Here"]); 

Использование регулярных выражений для разбора JSON будет по своей сути хрупким. Например, вы явно предполагаете, что в JSON нет пробелов вокруг двоеточия. Но может быть (и на самом деле, в вашем примере есть). Аналогично, вероятно, не разумно предположить, что значение для «Здесь» - это последний элемент (и, следовательно, вы можете искать кавычку, за которой следует закрывающая скобка, тогда как в какой-то будущей дате может следовать запятая, а не закрытие скобка). Хуже того, теоретически возможно (хотя и маловероятно), что в самом строчном значении будет иметься кавычка и закрывающая скобка в ней, поэтому вам действительно нужно проверить неэкономленные кавычки.

В то время как вы можете исправить регулярное выражение, использование анализатора JSON позволяет избежать всей этой дополнительной логики, которую вы должны были бы построить в сложное регулярное выражение.