Estou trabalhando em um projeto comercial de C ++ (não de código aberto) que é executado em um sistema baseado em Linux. Eu preciso fazer alguma regex dentro do código C ++. (Eu sei: agora tenho 2 problemas.)
PERGUNTA: Quais bibliotecas as pessoas que regularmente fazem regex de C / C ++ recomendam que eu pesquise? Uma rápida pesquisa chamou minha atenção para o seguinte:
1) Boost.Regex (preciso ler a licença de software Boost, mas esta questão não é sobre licenças de software)
2) C (não C ++) POSIX regex (#include <regex.h>, regcomp, regexec, etc.)
3) http://freshmeat.net/projects/cpp_regex/ (não sei nada sobre este; parece ser GPL, portanto, não pode ser usado neste projeto)
Respostas:
Boost.Regex é muito bom e está programado para se tornar parte do padrão C ++ 0x (já está em TR1).
Pessoalmente, acho Boost.Xpressive muito mais agradável de se trabalhar. É uma biblioteca apenas de cabeçalho e tem alguns recursos interessantes, como regexes estáticas (regexes compiladas em tempo de compilação).
Atualização: Se você estiver usando um compilador compatível com C ++ 11 (gcc 4.8 NÃO é!), Use std :: regex a menos que tenha um bom motivo para usar outra coisa.
fonte
Obrigado por todas as sugestões.
Experimentei algumas coisas hoje e, com o que estamos tentando fazer, optei pela solução mais simples, onde não preciso baixar nenhuma outra biblioteca de terceiros. No final, eu #include <regex.h> e usei as chamadas C POSIX padrão regcomp () e regexec (). Não C ++, mas em uma pitada isso provou ser o mais fácil.
fonte
Em projetos C ++ anteriores, usei o PCRE com bom sucesso. É muito completo e bem testado, pois é usado em muitos projetos de alto nível. E vejo que o Google também contribuiu com um conjunto de wrappers C ++ para PCRE recentemente.
fonte
C ++ tem uma biblioteca regex integrada desde TR1. A biblioteca regex do AFAIK Boost é muito compatível com ele e pode ser usada como um substituto, se sua biblioteca padrão não fornecer TR1.
fonte
Mais duas opções:
Se você pode escrever em c ++ 11 - Faça o tutorial: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339
Observação: no momento em que este artigo foi escrito, a única biblioteca regex c ++ 11 que eu sei que funciona é a clang / llvm , e só funciona no Mac. O GNU ainda não implementa regex . Não sei sobre o Visual Studio. A maioria das pessoas ainda usa a implementação boost regex .
Ou você pode usar o ragel para gerar uma máquina de estado finito para fazer a análise para você e gerar a implementação do código C / C ++: http://www.complang.org/ragel/
Usei um pouco para gerar código para analisar json. Este arquivo ragel: https://github.com/matiu2/yajp/blob/master/parser/number.rl é usado para gerar este código https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 e este diagrama de máquina de estado finito:
Atualização 1:
O regex libc ++ do lvm funciona no ubuntu 14.04: libc ++ - dev - Biblioteca LLVM C ++ Standard (arquivos de desenvolvimento). Ao compilar:
clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...
Atualização 2:
No momento, estou gostando do boost spirit 3 - gosto mais do que regex, porque tem regras de estilo BNF e é bem pensado. (Mais antigos (mais documentados) Libras do Qi do Espírito encontradas aqui )
fonte
Boost tem regex .
Isso deve preencher a conta
fonte
Você também pode consultar a biblioteca de regex rápida que foi desenvolvida no mecanismo de pesquisa Yandex para fazer correspondências rápidas de milhares de padrões contra grandes quantidades de dados.
fonte
Pessoalmente, sempre usei boost.regex (embora não precise de regex em C ++). O Microsoft Labs também tem uma biblioteca regex, chamada GRETA: http://research.microsoft.com/projects/greta/ . Aparentemente, é muito rápido e possui uma sintaxe Perl 5 completa. Eu não usei, mas você pode querer testá-lo.
fonte
Enfrentei uma situação semelhante e acabei usando Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
fonte
Ninguém aqui disse nada sobre o que vem com C ++ 0x. Se você estiver usando um compilador e o STL que suporta C ++ 0x, você pode apenas usar isso em vez de ter outra lib em seu projeto.
fonte