Ответ 1
Я заметил, что с iOS 4.0 Apple предоставляет класс NSRegularExpression. Кроме того, с 10.7 класс доступен под OS X.
Исходный 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 затем возвращает строку значения (или список значений), о которой я забочусь. Фактически, вы можете сохранить небольшой набор наборов функций, настроенных для определенных задач, а затем просто вызвать их по мере необходимости.
Я не знаю, использует ли этот метод огромные объемы повторных запросов синтаксического анализа, но для быстрого транзакционного материала он выполняет свою работу без каких-либо дополнительных внешних ресурсов или кода, которые вы не понимаете.
Мне нравится структура AGRegex, которая использует PCRE, удобна, если вы используете синтаксис PCRE. Лучшей версией этой структуры является тот, что был в IRC-клиенте Colloquy, поскольку он был обновлен для использования PCRE 6.7:
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
Он очень легкий, гораздо более, чем RegExKit (хотя и не такой способный, конечно).
NSRegularExpression
доступен с Mac OS X версии 10.7 и IOS 4.0.
Во время моего поиска по этой теме я наткнулся на CocoaOniguruma, в котором используется Oniguruma, механизм регулярного выражения за Ruby1.9 и PHP5. Это кажется немного более новым по сравнению с существующим OregKit (на японском языке). Не знаете, как они складываются против других привязок.
Googling alittle, нашел эту библиотеку: RegexOnNSString
Библиотека с открытым исходным кодом, содержащая следующие функции:
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
и используя класс NSRegularExpression
. Очень прост в использовании и не нужно ни о чем беспокоиться.
Обратите внимание, что NSRegularExpression
доступен с Mac OS X версии 10.7 и IOS 4.0, как упоминалось в Datasmid.
Я делаю это легко. Я добавляю новый файл С++ в проект 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()).