2012-04-23 3 views
1

Вот кодNSRegularExpression давая предупреждение

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)" options:NSRegularExpressionCaseInsensitive error:&error]; 

код сам по себе работает, но дает следующее предупреждение:

"Unknown escape sequence \." 

Я также пробовал варианты:

NSRegularExpressionCaseInsensitive|NSRegularExpressionAnchorsMatchLines 

но до сих пор ошибки сохраняется. Может ли кто-нибудь объяснить, почему возникает эта ошибка и как ее можно удалить.

+0

См. Http://stackoverflow.com/questions/6812206/unknown-escape-sequence-regular-expression –

ответ

5

Если написать регулярное выражение в виде строки буквального и содержит обратную косую черту, вы должны избавиться от них с помощью второй обратной косой черты, так как обратный слэш также используется для экранирования некоторых специальных символов (например, \n, \t и т.д.) в строках литералов ,

Так что если вы хотите, чтобы ваше регулярное выражение содержало \., вы должны написать его как \\.. Опять же, это применимо только в том случае, если вы используете строковые литералы, а не при загрузке регулярного выражения из файла.

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

+0

спасибо. но это меняет функциональность? –

+1

Да, это делает точку буквальной точкой в ​​регулярном выражении, в отличие от того, чтобы быть частью синтаксиса регулярных выражений. Я бы предположил, что это то, как предполагается использовать регулярное выражение. В противном случае вам придется удалить обратную косую черту, чтобы получить идентичное поведение без предупреждения. – omz

+0

@omz: Я думаю, что это не изменит смысл в этом случае. Предупреждение выглядит так, как будто это произошло от строкового процессора, а не от механизма регулярных выражений. Это означает, что он неявно переводится в '\\.'. Но это все еще полезно, потому что некоторые другие escape-последовательности, такие как '\ b' (backspace vs. word border), меняют свой смысл, если они не экранированы должным образом. –

Смежные вопросы