A pesquisa inicial indica que não há uma maneira integrada de fazer expressões regulares em um aplicativo Objective-C Cocoa.
Então, quatro perguntas:
Isso é mesmo verdade?
Você está brincando comigo?
Ok, existe uma boa biblioteca de código aberto que você recomenda?
Quais são as maneiras de se aproximar o suficiente sem importar uma biblioteca, talvez com a classe NSScanner?
objective-c
regex
cocoa
dreeves
fonte
fonte
Respostas:
Percebi que, a partir do iOS 4.0, a Apple fornece uma classe NSRegularExpression . Além disso, a partir de 10.7, a classe está disponível no OS X .
fonte
O RegExKitLite, por exemplo, não requer nenhuma biblioteca, basta adicionar o .m e .h ao seu projeto.
(Minha reclamação contra o RegExKitLite é que ela estende o NSString por categoria, mas também pode ser considerado um recurso. Também usa as bibliotecas ICU não públicas fornecidas com o sistema operacional, o que não é recomendado pela Apple.)
fonte
[myString rangeOfString:@"regex_here" options:NSRegularExpressionSearch]
O RegexKit é o melhor que eu já encontrei. Muito cacau: y. Estou usando a versão "Lite" em vários de nossos aplicativos para iPhone:
sourceforge
lingonikorg
fonte
Você pode usar a biblioteca de expressões regulares do POSIX (Yay para um sistema operacional compatível com POSIX). Experimentar
fonte
A solução barata e suja de hack que eu uso para resolver problemas de análise REGEX e JSON é criar um objeto UIWebView e injetar funções de Javascript para fazer a análise. A função javascript retorna uma sequência do valor (ou lista de valores) com que me preocupo. De fato, você pode armazenar um pequeno conjunto de funções de biblioteca personalizadas para tarefas específicas e depois chamá-las conforme necessário.
Não sei se essa técnica é dimensionada para grandes volumes de solicitações de análise repetidas, mas para coisas transacionais rápidas, ele faz o trabalho sem depender de recursos ou códigos externos extras que você talvez não entenda.
fonte
Gosto da estrutura AGRegex que usa PCRE, útil se você estiver acostumado com a sintaxe PCRE. A melhor versão dessa estrutura é a do cliente Colloquy IRC, pois foi atualizada para usar o PCRE 6.7:
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
É muito leve, muito mais que o RegExKit (embora não seja tão capaz, é claro).
fonte
NSRegularExpression
está disponível desde o Mac OS X v10.7 e IOS 4.0.fonte
Durante minha pesquisa neste tópico, deparei-me com o CocoaOniguruma, que usa o Oniguruma , o mecanismo de Expressão Regular por trás do Ruby1.9 e PHP5. Parece um pouco mais recente em comparação com o OregKit existente (em japonês). Não tenho certeza de como eles se comparam com outras ligações.
fonte
Pesquisando um pouco, encontrei esta biblioteca: RegexOnNSString
Biblioteca de código aberto, contendo funções como:
e usando
NSRegularExpression
classe. Muito fácil de usar e não precisa se preocupar com nada.Observe que
NSRegularExpression
está disponível desde o Mac OS X v10.7 e IOS 4.0, como o Datasmid mencionado.fonte
Eu facilito. Eu adiciono um novo arquivo C ++ ao meu projeto do Objective C, renomeio para .mm e, em seguida, crio uma classe C ++ padrão dentro. Em seguida, crio um método de classe estática na seção "public:" para uma função C ++ que pega um NSString e retorna um NSString (ou NSArray, se é isso que você deseja). Em seguida, converto o NSString em C ++ std :: string da seguinte forma:
A partir daí, eu posso usar regex_replace da seguinte maneira:
Em seguida, posso converter essa std :: string novamente em um NSString com:
Se você estiver usando apenas este C ++ apenas para esta função, poderá achar adequado chamar esse arquivo extra.mm (nome da classe Extra) e colocar esse método de classe estática e adicionar outros métodos de classe estática quando a situação chegar onde faz sentido fazê-lo em C ++, porque é menos problemático em alguns casos. (Há casos em que o ObjC faz algo com menos linhas de código e alguns casos em que o C ++ faz com menos linhas de código.)
PS Ainda outra maneira disso é usar um arquivo .mm, mas criar um wrapper de Objective C em torno do uso de std :: string e std :: regex_replace () (ou regex_match ()).
fonte