Регулярные выражения в приложении Objective-C Cocoa

Исходный Googling указывает, что нет встроенного способа делать регулярные выражения в приложении Objective-C Cocoa.

Итак, четыре вопроса:

  • Это правда?

  • Вы издеваетесь надо мной?

  • Хорошо, тогда есть хорошая библиотека с открытым исходным кодом, которую вы рекомендуете?

  • Какими способами достаточно приблизиться, не импортируя библиотеку, возможно, с классом NSScanner?

Ответ 2

  • Да, нет поддержки регулярных выражений в Cocoa. Если вас интересует только логическое соответствие, вы можете использовать NSPredicate, который поддерживает синтаксис регулярного выражения ICU. Но обычно вас интересует позиция матча или позиция подвыражений, и вы не можете получить его с помощью NSPredicate.
  • Как уже упоминалось, вы можете использовать функции регулярные выражения POSIX. Но они считаются медленными, а синтаксис регулярных выражений ограничен по сравнению с другими решениями (ICU/pcre).
  • Существует много библиотек OSS, CocoaDev имеет обширный список.
  • RegExKitLite, например, не требует каких-либо библиотек, просто добавьте .m и .h в свой проект.

    (Моя жалоба на RegExKitLite заключается в том, что она расширяет NSString через категорию, но ее можно рассматривать как функцию. Также она использует непубличные библиотеки ICU, поставляемые с ОС, что Apple не рекомендует.)

Ответ 3

RegexKit - лучшее, что я нашел. Очень Cocoa: y. Я использую версию Lite в нескольких наших приложениях для iPhone:

sourceforge

lingonikorg

Ответ 4

Вы можете использовать библиотеку POSIX Regular Expressions (Yay для ОС, совместимой с POSIX). Попробуйте

man 3 regex

Ответ 5

Дешевое и грязное решение для взлома, которое я использую для решения проблем с реестром REGEX и JSON, заключается в создании объекта UIWebView и введении Javascript-функций для синтаксического анализа. Функция javascript затем возвращает строку значения (или список значений), о которой я забочусь. Фактически, вы можете сохранить небольшой набор наборов функций, настроенных для определенных задач, а затем просто вызвать их по мере необходимости.

Я не знаю, использует ли этот метод огромные объемы повторных запросов синтаксического анализа, но для быстрого транзакционного материала он выполняет свою работу без каких-либо дополнительных внешних ресурсов или кода, которые вы не понимаете.

Ответ 6

Мне нравится структура AGRegex, которая использует PCRE, удобна, если вы используете синтаксис PCRE. Лучшей версией этой структуры является тот, что был в IRC-клиенте Colloquy, поскольку он был обновлен для использования PCRE 6.7:

http://colloquy.info/project/browser/trunk/Frameworks/AGRegex

Он очень легкий, гораздо более, чем RegExKit (хотя и не такой способный, конечно).

Ответ 7

NSRegularExpression доступен с Mac OS X версии 10.7 и IOS 4.0.

Ответ 8

Во время моего поиска по этой теме я наткнулся на CocoaOniguruma, в котором используется Oniguruma, механизм регулярного выражения за Ruby1.9 и PHP5. Это кажется немного более новым по сравнению с существующим OregKit (на японском языке). Не знаете, как они складываются против других привязок.

Ответ 9

Googling alittle, нашел эту библиотеку: RegexOnNSString

Библиотека с открытым исходным кодом, содержащая следующие функции:

-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase

и используя класс NSRegularExpression. Очень прост в использовании и не нужно ни о чем беспокоиться.

Обратите внимание, что NSRegularExpression доступен с Mac OS X версии 10.7 и IOS 4.0, как упоминалось в Datasmid.

Ответ 10

Я делаю это легко. Я добавляю новый файл С++ в проект 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()).