Невозможно извлечь информацию, используя NSRegularExpression - PullRequest
0 голосов
/ 12 декабря 2011

Я занимаюсь разработкой приложения для iPhone, которое будет использовать NSRegularExpression для сопоставления с шаблоном из строки для извлечения информации.Здесь я пытаюсь извлечь ссылку mailTo из заголовка письма.Я успешно получил строку заголовка электронного письма, и теперь я применяю шаблон поиска, используя NSregularExpression, чтобы получить идентификатор электронной почты из строки заголовка.

Это текст заголовка, из которого я хочу извлечь mailTo:

Список-Отписаться:? subject = Unsubscribe>, >

Это шаблон поиска:

mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)?

мой код такой

NSString *str= @"List-Unsubscribe: <mailto:suksh-1142-5451-d8135921c2e2d40400ab02fa31eda529@usub.mailserv.in>?subject=Unsubscribe>,<http://suksh.mailserv.in/suksh/?p=unsubscribe&mid=5451&uid=d8135921c2e2d40400ab02fa31eda529>>";

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)?"];
NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:str options:0 range:NSMakeRange(0, [str length])];

if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
    NSString *substringForFirstMatch = [str substringWithRange:rangeOfFirstMatch];
    NSLog(@"Extracted URL: %@",substringForFirstMatch);
}

но когда я идучтобы создать объект NSRegularExpression с помощью regularExpressionWithPattern:, он возвращает нулевой объект.

Пожалуйста, помогите мне, в чем может быть проблема.

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

1 Ответ

1 голос
/ 12 декабря 2011

Строка шаблона будет обработана дважды: один раз компилятором, затем NSRegularExpression. Вы должны избежать обратной косой черты, чтобы компилятор не обрабатывал каждый "\?".

Ни в документации NSRegularExpression, ни ICU не упоминается поддержка именованных групп захвата ((?<name>pattern)); это может привести к сбою синтаксического анализа шаблона или сбою сопоставления.

Используйте regularExpressionWithPattern:options:error: при создании регулярного выражения, чтобы получить объект error , который сообщит вам, почему конструирование не удалось.

NSError *theError;
// '?\?(' is to prevent '??(' from being interpreted as a trigraph
NSString *pattern = @"mailto:(?<address>[^\\?^>]+)\\?\?(?<params>[^>]+)?";
NSRegularExpression *regex;
NSRange rangeOfFirstMatch;

regex = [NSRegularExpression regularExpressionWithPattern:pattern 
            options:0 error:&theError];
if (regex) {
    rangeOfFirstMatch = [regex rangeOfFirstMatchInString:str 
                            options:0 range:NSMakeRange(0, [str length])];

    if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
        NSString *substringForFirstMatch = [str substringWithRange:rangeOfFirstMatch];
        NSLog(@"Extracted URL: %@",substringForFirstMatch);
    }
} else {
    // couldn't compile RE
    NSAlert *errorAlert;
    if (theError) {
        errorAlert = [NSAlert alertWithError:theError];
    } else {
        NSString *errorMsg = @"Couldn't parse unsubscribe header because the pattern /%@/ isn't a valid regular expression.";
        errorAlert = [NSAlert 
                 alertWithMessageText:@"Invalid Pattern"
                        defaultButton:nil
                      alternateButton:nil
                          otherButton:nil
            informativeTextWithFormat:[NSString stringWithFormat:errorMsg, pattern]];
    }
    [theAlert runModal]; // Ignore return value.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...