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

172

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

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

  • Это правда?

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

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

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

  • 4
    Хмммм ... Интересно, что произойдет, если вы используете Monotouch. +1 за вопрос.
Теги:
cocoa

10 ответов

141
Лучший ответ

Я заметил, что с iOS 4.0 Apple предоставляет класс NSRegularExpression. Кроме того, с 10.7 класс доступен под OS X.

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

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

  • 3
    Имейте в виду, что функции регулярного выражения POSIX не работают с юникодом (только ASCII).
  • 0
    К вашему сведению, URL-адрес NSP-предиката является неработающей ссылкой
Показать ещё 4 комментария
19

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

sourceforge

lingonikorg

  • 1
    Я второй RegexKit Lite. Очень хорошо!
  • 1
    Круто, чем больше людей этим пользуются, тем лучше, наверное, станет!
11

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

man 3 regex
  • 0
    О, я вижу. это способ сделать это в прямом C, который, вероятно, должен работать в любом приложении Objective-C. хорошо, спасибо! это в основном принятый способ сделать это?
  • 0
    Это способ, который не требует каких-либо дополнительных зависимостей. Существуют и другие варианты с точки зрения библиотек с открытым исходным кодом, которые вы можете импортировать (PCRE, для регулярных выражений Perl, библиотека Boost RegEx, если вы используете Obj-C ++, или другие, перечисленные в других ответах).
Показать ещё 3 комментария
8

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

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

  • 1
    +1 за изобретательность :)
6

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

6

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

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

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

  • 0
    Почему менее способный, если он имеет полное Perl-совместимое регулярное выражение?
  • 0
    Связанные вспомогательные методы Objective-C не так обширны, как в RegExKit, но подходят для большинства целей.
4

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

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

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

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

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

4

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню