Регулярные выражения в приложении Objective-C Cocoa - PullRequest
173 голосов
/ 08 января 2009

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

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

  1. Это правда?

  2. Ты что, шутишь?

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

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

Ответы [ 10 ]

141 голосов
/ 24 августа 2010

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

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

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

19 голосов
/ 08 января 2009

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

SourceForge

lingonikorg

11 голосов
/ 08 января 2009

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

man 3 regex
8 голосов
/ 06 апреля 2011

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

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

6 голосов
/ 18 февраля 2012

NSRegularExpression доступно начиная с Mac OS X v10.7 и IOS 4.0.

6 голосов
/ 08 января 2009

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

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

Он очень легкий, намного больше, чем RegExKit (хотя, конечно, не так хорошо).

4 голосов
/ 06 марта 2012

Погуглил, нашел эту библиотеку: RegexOnNSString

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

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

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

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

4 голосов
/ 21 января 2009

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

1 голос
/ 18 июня 2016

Я делаю это легко. Я добавляю новый файл C ++ в свой проект Objective C, переименовываю его в .mm, а затем создаю стандартный класс C ++ внутри. Затем я делаю метод статического класса в разделе «public:» для функции C ++, которая принимает NSString и возвращает NSString (или NSArray, если это то, что вы хотите). Затем я конвертирую NSString в C ++ 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());

Если вы используете этот C ++ только для этой функции, то вам может пригодиться вызвать этот файл extra.mm (имя класса Extra) и поместить этот метод статического класса, а затем добавить другие методы статического класса, когда Ситуация наступает там, где имеет смысл сделать это в C ++, потому что в некоторых случаях это менее хлопотно. (В некоторых случаях ObjC делает что-то с меньшим количеством строк кода, а в некоторых случаях C ++ делает это с меньшим количеством строк кода.)

P.S. Еще один способ - использовать файл .mm, но создать оболочку Objective C для использования std :: string и std :: regex_replace () (или regex_match ()).

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