Регулярное решение для Objective-C - PullRequest
10 голосов
/ 10 мая 2009

Каков наилучший метод для использования Регулярных выражений в Objective-C?

Кажется, есть какой-то проект с открытым исходным кодом, обеспечивающий поддержку regex , может ли кто-нибудь порекомендовать один?

Также я посмотрел на NSPredicate, кто-нибудь может предложить regex примеры?

Справочная информация: я хочу использовать регулярные выражения в основном для проверки, IP-адреса, адреса электронной почты, внутренние идентификаторы и т. Д.

Ответы [ 7 ]

13 голосов
/ 10 мая 2009
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"];
BOOL result = [predicate evaluateWithObject:@"mail@domain.com"];

Согласно руководству по предикату :

Матчи
Выражение левой руки равно выражению правой руки, используя сравнение в стиле регулярных выражений согласно ICU v3 (подробнее см. ICU Руководство пользователя для Регулярных выражений ).

Существует даже пример, написанный Apple , который можно найти в руководстве.

Вместо SELF вы также можете использовать путь ключа . (И возможно некоторые другие литералы тоже.)

8 голосов
/ 23 июня 2009

Пожалуйста, прочитайте полный пост на http://cocoawithlove.com.

В Какао NSPredicate работает во многих так же, как предложение "ГДЕ" SQL. Основная причина, по которой NSP предикат приносят в iPhone, что NSPredicate выполняет ту же роль в Базовые данные, которые удовлетворяют условиям "ГДЕ" в SQL - разрешить постоянное хранилище извлекать объекты, которые удовлетворяют конкретным критерии.

// given an NSDictionary created used the above method named "row"...
NSPredicate *johnSmithPredicate =
    [NSPredicate predicateWithFormat:@"firstname = 'John' AND lastname = 'Smith'"];
BOOL rowMatchesPredicate = [johnSmithPredicate evaluateWithObject:row];

Проверка адреса электронной почты

Оператор сравнения "LIKE" в NSPredicate (NSLikePredicateOperatorType) обычно используется как удобное средство тестирование, если NSString соответствует Регулярное выражение. Это преимущество над полными библиотеками с большим варианты и возможность замены что это уже в какао - нет библиотеки, без связей, без хлопот.

Вы можете сделать простой тест:

NSPredicate *regExPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularExpressionString];
BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject:myString];

Единственный вопрос, который остается: что такое регулярное выражение, которое может использоваться для проверки того, что NSString содержит синтаксически действительный адрес электронной почты адрес

NSString *emailRegEx =
    @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
    @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
    @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
    @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
    @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
    @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
    @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
5 голосов
/ 17 мая 2011

Попробуйте официальное выражение NSRegualExpression, которое доступно с iOS 4.0:

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html

5 голосов
/ 10 мая 2009
2 голосов
/ 10 мая 2009

Попробуйте с CSRegex: http://www.cocoadev.com/index.pl?CSRegex

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

1 голос
/ 10 мая 2009

попробуйте это: http://regexkit.sourceforge.net/

0 голосов
/ 10 мая 2009

Другой вариант - это оболочка libregex в Google Toolbox для Mac: http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/GTMRegex.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...