Исходный Googling указывает, что нет встроенного способа делать регулярные выражения в приложении Objective-C Cocoa.
Итак, четыре вопроса:
Это правда?
Вы издеваетесь надо мной?
Хорошо, тогда есть хорошая библиотека с открытым исходным кодом, которую вы рекомендуете?
Какими способами достаточно приблизиться, не импортируя библиотеку, возможно, с классом NSScanner?
Я заметил, что с iOS 4.0 Apple предоставляет класс NSRegularExpression. Кроме того, с 10.7 класс доступен под OS X.
RegExKitLite, например, не требует каких-либо библиотек, просто добавьте .m и .h в свой проект.
(Моя жалоба на RegExKitLite заключается в том, что она расширяет NSString через категорию, но ее можно рассматривать как функцию. Также она использует непубличные библиотеки ICU, поставляемые с ОС, что Apple не рекомендует.)
RegexKit - лучшее, что я нашел. Очень Cocoa: y. Я использую версию Lite в нескольких наших приложениях для iPhone:
Вы можете использовать библиотеку POSIX Regular Expressions (Yay для ОС, совместимой с POSIX). Попробуйте
man 3 regex
Дешевое и грязное решение для взлома, которое я использую для решения проблем с реестром REGEX и JSON, заключается в создании объекта UIWebView и введении Javascript-функций для синтаксического анализа. Функция javascript затем возвращает строку значения (или список значений), о которой я забочусь. Фактически, вы можете сохранить небольшой набор наборов функций, настроенных для определенных задач, а затем просто вызвать их по мере необходимости.
Я не знаю, использует ли этот метод огромные объемы повторных запросов синтаксического анализа, но для быстрого транзакционного материала он выполняет свою работу без каких-либо дополнительных внешних ресурсов или кода, которые вы не понимаете.
NSRegularExpression
доступен с Mac OS X версии 10.7 и IOS 4.0.
Мне нравится структура AGRegex, которая использует PCRE, удобна, если вы используете синтаксис PCRE. Лучшей версией этой структуры является тот, что был в IRC-клиенте Colloquy, поскольку он был обновлен для использования PCRE 6.7:
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
Он очень легкий, гораздо более, чем RegExKit (хотя и не такой способный, конечно).
Googling alittle, нашел эту библиотеку: RegexOnNSString
Библиотека с открытым исходным кодом, содержащая следующие функции:
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
и используя класс NSRegularExpression
. Очень прост в использовании и не нужно ни о чем беспокоиться.
Обратите внимание, что NSRegularExpression
доступен с Mac OS X версии 10.7 и IOS 4.0, как упоминалось в Datasmid.
Во время моего поиска по этой теме я наткнулся на CocoaOniguruma, в котором используется Oniguruma, механизм регулярного выражения за Ruby1.9 и PHP5. Это кажется немного более новым по сравнению с существующим OregKit (на японском языке). Не знаете, как они складываются против других привязок.
Я делаю это легко. Я добавляю новый файл С++ в проект Objective C, переименовываю его как .mm, а затем создаю стандартный класс С++ внутри. Затем я создаю метод статического класса в разделе "public:" для функции С++, которая принимает NSString и возвращает NSString (или NSArray, если это то, что вы хотите). Затем я конвертирую NSString в С++ std::string следующим образом:
// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
std::string sTemp([sInput UTF8String]);
s = sTemp;
}
Оттуда я могу использовать regex_replace так:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
Затем я могу преобразовать этот std::string обратно в NSString с помощью:
NSString *sResponse2 = @(sResult.c_str());
Если вы используете этот С++ только для этой функции, вы можете сочтете нужным вызвать этот файл extra.mm(имя класса Extra) и поместить этот статический класс в класс, а затем добавить другие методы статического класса, когда ситуация приходит, когда имеет смысл делать это на С++, потому что в некоторых случаях это меньше хлопот. (Есть случаи, когда ObjC делает что-то с меньшим количеством строк кода, а некоторые случаи, когда С++ делает это с меньшим количеством строк кода.)
P.S. Еще один способ заключается в использовании файла .mm, но создайте обертку Objective C вокруг использования std::string и std:: regex_replace() (или regex_match()).