C ++: qual biblioteca regex devo usar? [fechadas]

107

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)

Stéphane
fonte
20
Caso alguém esteja olhando para esta velha questão em busca de dicas ... uma nova biblioteca apareceu recentemente que merece ser mencionada: RE2 do Google: code.google.com/p/re2
Stéphane
2
Este é um invólucro c ++ para a nova biblioteca PCRE2 (versão revisada do PCRE).
Jahid

Respostas:

80

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.

Ferruccio
fonte
4
O Boost está cheio de bugs e parece não ter padrões de codificação e processo de controle de qualidade. Não é realmente adequado para software de produção. Isso inclui seu equipamento Regex, que usa C (em vez de C ++) em alguns lugares e inclui buffer overflows devido a funções inseguras, como sprintf. Quando relatei um monte de bugs após uma auditoria, eles permaneceram "não reconhecidos" meses após o relatório. Use por sua conta e risco.
jww
8
Quase 5 anos depois, tentei hoje usar std :: regex, mas descobri que ainda não foi implementado no GCC. Consulte stackoverflow.com/questions/15671536/…
Stéphane
2
essa boa razão para não usar std :: regex ou boost :: regex seria que boost :: regex, é cerca de 10 vezes mais lento que re2
Arsen Zahray
3
@jww Não, o padrão C ++ (C ++ 03 TR, C ++ 11 e C ++ 1y) decidiu incorporar várias bibliotecas de reforço ao padrão . Isso significa que, para todos os efeitos práticos, Boost tornou-se o padrão. Fazer afirmações sem evidências usando palavras evasivas como "provavelmente" e usando ataques pessoais não mudam o fato de que grandes partes do boost são agora C ++, e muitas das pessoas que definem a direção moderna do C ++ também estão trabalhando no boost.
Alice
3
@Alice - Os comitês C e C ++ criam padrões. Eles não incorporam bibliotecas. Não sei se eles alguma vez produziram uma biblioteca.
jww
22

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.

Stéphane
fonte
19

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.

Greg Hewgill
fonte
16

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.

Kasprzol
fonte
Qual compilador tem TR1? Minha cópia do g ++ 4.1.2 (Debian Etch) não tem suporte para #include <regex>, mas obrigado por chamar a minha atenção para TR1, eu tinha esquecido. Para outros curiosos para saber mais sobre TR1 e C ++ 0x, consulte en.wikipedia.org/wiki/Technical_Report_1
Stéphane,
A partir do SP1, o Visual Studio 2008 tem a maior parte do TR1, incluindo regex. Eu sei que não ajuda você no Linux, mas outros podem estar interessados. O Dinkumware também suporta TR1 no gcc.
Michael Burr,
Como escrevi, se sua biblioteca std não tiver regex, você pode usar boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol
3
g ++ 4.5.0. TR1 vive em tr1 / regex. por exemplo: #include <tr1 / regex>
Ogre Salmo33
11

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:

diagrama de estado


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 )

matiu
fonte
7

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.

Alexander Gololobov
fonte
6

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.

Roel
fonte
8
GRETA ( research.microsoft.com/en-us/downloads/… ) foi feito por Eric Niebler quando ele trabalhava na Microsoft (1998-2001 a partir dos arquivos de cabeçalho do GRETA). Eric Niebler então fez em 2007 Boost.Xpressive. As pessoas deveriam usar Boost.Xpressive porque é mais novo e tem uma licença melhor do que o "contrato de licença de usuário final da Microsoft Research"
Cristian Adam,
1
Desculpe, não vejo como puxar na biblioteca Boost é uma coisa boa. A última vez que verifiquei o download local da versão não compactada do boost é de 400 megs. Para não mencionar a loucura de modelo inútil que você obtém com impulso. Desculpe, recomendo a resposta de Greg.
Chade,
@Chad Porque boost é um conjunto bem conhecido e considerado de bibliotecas padrão que são úteis em muitas situações? Se o tamanho do download for muito grande para você, use o BCD para remover tudo o que você não precisa; boost.regex é muito pequeno quando removido dessa maneira.
Alice
1

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.

RedX
fonte
1
Se você olhar para a resposta com maior votação (de 2+ anos atrás), ela menciona isso.
Mateen Ulhaq